为啥 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++ 中编译成功? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以在 C 中调用一个函数而不声明它,但在 C++ 中却不能?

为啥 c++ 编译器不会警告返回对局部变量的引用?

为啥我们需要一个默认构造函数来在 C++ 中通过引用传递一个对象?

为啥成员函数的符号很弱?

Visual Studio 2010在编译c++时为啥有错误也没有下划波浪线?

如何在 Eigen (C++) 中处理复数?