我不明白为什么要编译

I do not understand why this compiles

我当然遗漏了一些东西,但我不明白为什么这会编译(同时使用 g++ 和 clang++):

struct A
{
};
struct B
{
};

int main()
{
  A a(B);
}

首先,B 是一个类型...不是一个值。我该如何解读这段代码?

它被解释为一个名为 a 的函数的声明,它接受一个 B 和 returns A.

类型的参数

它只是一个函数声明,声明 a 是一个返回 A 并接受一个 B 类型的未命名参数的函数。

它是有效的,因为在函数定义中允许函数声明而不是函数定义。

此问题称为 most vexing parse。行 A a(B); 可以解释为名为 a 的函数的声明返回类型 A 的对象并采用类型 B.

的未命名参数

避免此问题的一种方法是使用 C++11 中引入的 统一初始化 语法,其中包括使用大括号而不是圆括号:A a{B}; returns一个错误。该行现在被解释为用 B 初始化的变量声明,它是一种类型而不是值。

这里有更多信息:

The Most Vexing Parse: How to Spot It and Fix It Quickly