目前正在努力理解C++11统一初始化。我遇到了这种模棱两可的情况:考虑一个类,它可以通过两个参数构造函数或任意长度的初始化列表进行构造:
class Foo {
public:
Foo(int a, int b) {
std::cout << "constructor 1" << std::endl;
}
Foo(std::initializer_list<int>) {
std::cout << "constructor 2" << std::endl;
}
};
遵循统一初始化惯例,我期望以下内容可以工作:
Foo a (1, 2)
输出 constructor 1
(显然)
Foo b {1, 2}
输出 constructor 1
Foo c = {1, 2}
输出 constructor 2
但是,似乎编译器将Foo b {1, 2}
解释为列表初始化,并调用构造函数2。当存在初始化列表构造函数时,()
语法是强制编译器考虑其他类型的构造函数唯一的方式吗?