由于 C++11 引入了新的统一初始化语法,许多人建议使用它来代替旧式语法。至少,如果不是因为这种所谓的极端情况:
struct Foo {
Foo(int){
std::cout << "default" << std::endl;
}
Foo(std::initializer_list<int>){
std::cout << "initlist" << std::endl;
}
};
int main(){
Foo f{200}; //prints "initlist"
}
使用 {}-always-style 会带来麻烦,尤其是在模板中。新语法似乎只有三种安全用法:
- 显式请求 std::initializer_list-constructors
- POD 构造函数
- 默认构造函数
但也有一种情况,我们必须使用统一的初始化语法:非静态数据成员初始化器。由于某种原因,C++ 可以识别
void Bar() {
Foo f(200);
}
但无法处理
struct Bar {
Foo f(200);
};
问题 #1:为什么 () 语法在函数内部起作用而不是在类中起作用?有谁知道这背后的原理?
综上所述,最后我们遇到了这个愚蠢的案例:
struct FooBar {
std::vector<int> bar(50); //doesn't work
std::vector<int> bar{50}; //not the intended effect
std::vector<int> bar = std::vector<int>(50); //works
};
当然,您也不能将 auto 用于数据成员。所以我要么不得不笨拙地混合所有语法,要么根本不使用这些功能。
问题2:我是不是误会了什么?这不可能是预期的行为,可以吗?