为什么 Foo(b) 在 C++ 中编译成功?

Sar*_*esh 7 c++ declaration language-lawyer

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

class Foo {
};
int main() {
    Foo(b);
}
Run Code Online (Sandbox Code Playgroud)

即使没有b. 对此有什么解释吗?

son*_*yao 11

它本身就是一个声明。它声明了一个以btype命名的变量Foo,即与Foo b;.

[stmt.ambig]/1

有一个在语法涉及的歧义表达式语句小号声明小号:一个表达式语句函数式的显式类型转换为最左边的子表达式可以区分从一个声明,其中第一说明符与开始(。在这些情况下,该语句是一个声明

[stmt.ambig]/2

其余情况是声明s。[ 例子:

class T {
  // ...
public:
  T();
  T(int);
  T(int, int);
};
T(a);               //  declaration
Run Code Online (Sandbox Code Playgroud)

...