在 C++ 中将未命名临时变量括起来

发布于 2025-01-04 16:53:29 字数 423 浏览 0 评论 0原文

考虑以下代码:

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

Consider the following code:

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.
}

Why are the parenthesis around the temporary version required? What ambiguity do they solve?

My hunch is: I think the compiler sees Bar(foo) as a declaration for a function, but I'm not sure why that would be the case since foo (the instance) is not a type. The parenthesis, therefore, force the above to be treated as an expression, not as a forward declaration.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

许久 2025-01-11 16:53:29

恭喜您发现最令人烦恼的解析

斯科特·迈耶斯对此进行了如下描述:

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

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

Congratulations on discovering the most vexing parse.

Scott Meyers describes it as follows:

In general, the [C++] language (thanks, unfortunately, to its history) will try to interpret any declaration made like this as the declaration of a function.

In your case, introducing parentheses disambiguates the parse, forcing it to become a local.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文