【发布时间】:2012-09-09 03:18:44
【问题描述】:
在talk about initialization lists 中,我理解 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's 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 时,它会起作用。
【问题讨论】:
-
带有花括号的新构造语法不应该是所有以前构造语法的通用替代品。不幸的是,这是一个非常普遍的误解。
标签: c++ constructor c++11 language-lawyer curly-braces