C++ 在C+中插入未命名的临时表+;
考虑以下代码:C++ 在C+中插入未命名的临时表+;,c++,declaration,C++,Declaration,考虑以下代码: struct Foo { }; struct Bar { explicit Bar(const Foo&) { } }; int main() { Foo foo; Bar bar(foo); // Okay. Bar(foo); // Will not compile. (Bar(foo)); // Okay. Unnamed temporary requires parenthesis. } 为什么临时版本周围的括号是必
struct Foo
{
};
struct Bar
{
explicit Bar(const Foo&)
{
}
};
int main()
{
Foo foo;
Bar bar(foo); // Okay.
Bar(foo); // Will not compile.
(Bar(foo)); // Okay. Unnamed temporary requires parenthesis.
}
为什么临时版本周围的括号是必需的?它们解决了什么样的歧义
我的直觉是:我认为编译器将
Bar(foo)
视为函数的声明,但我不确定为什么会这样,因为foo
(实例)不是类型。因此,括号强制将上述内容视为一个表达式,而不是转发声明。祝贺您发现了
Scott Meyers将其描述如下:
一般来说,[C++]语言(不幸的是,感谢它的历史)会试图将任何这样的声明解释为函数的声明
在您的例子中,引入括号可以消除解析的歧义,迫使它成为本地解析