bit*_*ask 6 c++ constructor curly-braces language-lawyer c++11
在关于初始化列表的讨论中,我理解Stroustrup基本上说用花括号的新构造语法应该是所有先前构造语法的一般替代:
X x1(); // most vexing parse ... doesn't work as intended
X x2(x1);
X x3 = x1;
X x4 = X();
Run Code Online (Sandbox Code Playgroud)
相反,新语法应该被统一使用,作为一种可能的替代品,你可以在每种情况下使用......再一次,这是我从他的谈话中得到的核心信息.也许我误解了他.
那么,问题是,这种语法有多通用?是否有可能永远不会在新的C++ 11代码中使用旧式构造,或者是否有必须还原的情况?
当我遇到以下错误时触发/激发了这个问题,我认为这是编译器中的错误(但我很乐意得到纠正).
struct X {};
int main() {
X x;
X& y{x}; // works with (x)
X& z{y}; // works with (y)
}
Run Code Online (Sandbox Code Playgroud)
哪个不能在g ++ 4.7.1上编译,也不在ideone的4.5.1上编译.
prog.cpp: In function 'int main()':
prog.cpp:5:9: error: invalid initialization of non-const reference of type 'X&' from an rvalue of type '<brace-enclosed initializer list>'
prog.cpp:6:9: error: invalid initialization of non-const reference of type 'X&' from an rvalue of type '<brace-enclosed initializer list>'
Run Code Online (Sandbox Code Playgroud)
需要注意的是它的工作原理,当我更换X使用int.
Brace初始化适用于使用初始化程序的所有位置.在某些情况下,您必须使用parens来访问大括号初始化程序无法访问的构造函数,但它们很少见.
std::vector<int> v(1,1);
std::vector<int> v{1,1};
Run Code Online (Sandbox Code Playgroud)
vector<int>碰巧有一个专门的构造函数需要两个ints,因此试图构造一个两个int长的向量是不明确的.模糊构造函数仅用于向后兼容.不应使用任何与initializer_list冲突的构造函数定义新类.
大括号通过大括号初始化语法优先于其他构造函数而不是其他构造函数的事实来解决.如果要解决歧义而支持使用非initializer_list构造函数,则不能使用大括号初始化.
Bjarne Stroustrup写道
在C++ 11中只能实现{}初始化的统一使用,因此较旧的C++代码使用()和=初始化.因此,()和=可能对您更熟悉.但是,我不知道更喜欢()表示法的任何逻辑原因,除非在极少数情况下需要区分初始化与元素列表和构造函数参数列表.
- C++编程语言,第四版 §17.3.2.1
您的示例代码完全合法,应该按预期工作.你得到的错误只是GCC中的一个错误.Clang和VC++ 2012都接受代码.
| 归档时间: |
|
| 查看次数: |
487 次 |
| 最近记录: |