【问题标题】:Parenthesizing Unnamed Temporaries in C++在 C++ 中为未命名的临时对象加上括号
【发布时间】:2012-02-11 02:00:13
【问题描述】:

考虑以下代码:

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(实例)不是类型。因此,括号强制将上述内容视为表达式,而不是前向声明。

【问题讨论】:

    标签: c++ declaration


    【解决方案1】:

    恭喜您发现most vexing parse

    Scott Meyers 描述如下:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 2010-12-04
      • 2021-10-24
      • 2016-04-13
      相关资源
      最近更新 更多