【发布时间】:2020-10-01 00:16:53
【问题描述】:
目前我正试图围绕 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 (duh)
Foo b {1, 2} 打印 constructor 1
Foo c = {1, 2} 打印 constructor 2
但是,编译器似乎将 Foo b {1, 2} 解释为列表初始化,并调用构造函数 2。() 语法是强制编译器在初始化列表构造函数时考虑其他类型的构造函数的唯一方法吗?在场吗?
【问题讨论】:
-
相关:stackoverflow.com/questions/9976927/… -- std::vector 是一个“经典示例”,尽管我在 SO 上几乎找不到提及它。