为啥 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-statements 和 declarations 的语法中存在歧义:一个 expression-statement 和一个 @987654325 @ 因为它最左边的子表达式与 declaration 无法区分,其中第一个 declarator 以
(
开头。在这些情况下,statement 是 declaration。
和[stmt.ambig]/2
剩下的情况是declarations。 [ 例子:
class T // ... public: T(); T(int); T(int, int); ; T(a); // declaration
...
【讨论】:
谢谢宋元瑶。我认为它是临时创建的。以上是关于为啥 Foo(b) 在 C++ 中编译成功? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我可以在 C 中调用一个函数而不声明它,但在 C++ 中却不能?
为啥我们需要一个默认构造函数来在 C++ 中通过引用传递一个对象?