在谈论初始化列表中,我理解Stroustrup基本上是在说使用花括号的新构造语法应该成为所有先前构造语法的通用替代品。
相反,新的语法应该被统一使用作为可能的替代方案,你可以在任何情况下使用...这是我从他的演讲中得出的核心信息。也许我误解了他。
那么问题是,这种语法有多通用?在新的C++11代码中,是否有可能永远不使用旧式构造,或者是否存在必须回退的情况?
当我遇到以下错误时,我相信这是编译器中的错误(但如果有改正意见,我会很高兴接受)。
请注意,当我将
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
时,它有效。