在一次关于初始化列表的讨论中,我理解 Stroustrup 基本上是说带有花括号的新构造语法应该是对所有以前的构造语法的一般替代:
X x1(); // most vexing parse ... doesn't work as intended
X x2(x1);
X x3 = x1;
X x4 = X();
相反,新语法应该被统一使用,作为一种可能的替代品,你可以在任何情况下使用……再说一次,这是我从他的演讲中得到的核心信息。也许我误解了他。
所以,问题是,这种语法有多通用?是否有可能永远不要在新的 C++11 代码中使用旧式构造,或者是否存在必须恢复的情况?
当我遇到以下错误时触发/激发了这个问题,我认为这是编译器中的错误(但我很乐意得到纠正)。
struct X {};
int main() {
X x;
X& y{x}; // works with (x)
X& z{y}; // works with (y)
}
它不能在 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>'
请注意,当我替换X
为int
.