用C语言对未命名的临时对象进行括号

时间:2012-02-11 02:00:13

标签: 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.
}

为什么需要临时版本的括号?他们解决了什么歧义?

我的预感是:我认为编译器将Bar(foo)视为函数的声明,但我不确定为什么会出现这种情况,因为foo(实例)不是类型。因此,括号强制将上述内容视为表达式,而不是前向声明。

1 个答案:

答案 0 :(得分:5)

恭喜发现most vexing parse

Scott Meyers将其描述如下:

  

一般来说,[C ++]语言(不幸的是,感谢其历史)将尝试将任何声明解释为函数声明。

在你的情况下,引入括号消除了解析的歧义,迫使它成为一个本地。