考虑以下代码:
#include <iostream>
struct A {
A(int, int) {
std::cout << "A::A(int, int)\n";
}
A(std::initializer_list<int>) {
std::cout << "A::A(std::initializer_list<int>)\n";
}
};
struct B {
A a(1, 2); // compiler error
};
struct C {
A a{1, 2}; // always call A::A(std::initializer_list<int>)
};
struct D {
A a{A(1, 2)}; // always call A::A(int, int), how UgLy it is!
};
int main() {
new B{};
new C{};
new D{};
}
还有比
A a{A(1, 2)};
更好的解决方案吗?
成员的默认成员初始值设定项应该是大括号或等于初始值设定项。 (不能使用括号,因为在某些情况下它可能与函数声明语法冲突。)
因此,可以通过以下两种方式之一来初始化成员:
使用相等初始化器:
struct B {
A a = A(1, 2);
};
在构造函数中使用成员初始值设定项列表:
struct B {
A a;
B(): a(1, 2) {}
};