为啥 Foo(b) 在 C++ 中编译成功? [复制]

Posted

技术标签:

【中文标题】为啥 Foo(b) 在 C++ 中编译成功? [复制]【英文标题】:Why does Foo(b) compile successfully in C++? [duplicate]为什么 Foo(b) 在 C++ 中编译成功? [复制] 【发布时间】:2020-03-08 04:51:14 【问题描述】:

当我编译下面的代码时出现了一个奇怪的行为:

class Foo 
;
int main() 
    Foo(b);

即使没有声明b,它也能成功编译。 对此有何解释?

【问题讨论】:

【参考方案1】:

它本身就是一个声明。它声明了一个名为b 类型为Foo 的变量,即与Foo b; 的效果相同。

[stmt.ambig]/1

在涉及 expression-statementsdeclarations 的语法中存在歧义:一个 expression-statement 和一个 @987654325 @ 因为它最左边的子表达式与 declaration 无法区分,其中第一个 declarator( 开头。在这些情况下,statementdeclaration

和[stmt.ambig]/2

剩下的情况是declarations。 [ 例子:

class T 
  // ...
public:
  T();
  T(int);
  T(int, int);
;
T(a);               //  declaration

...

【讨论】:

谢谢宋元瑶。我认为它是临时创建的。

以上是关于为啥 Foo(b) 在 C++ 中编译成功? [复制]的主要内容,如果未能解决你的问题,请参考以下文章