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++]语言(不幸的是,感谢它的历史)会试图将任何这样的声明解释为函数的声明

在您的例子中,引入括号可以消除解析的歧义,迫使它成为本地解析