我不明白为什么要编译
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
初始化的变量声明,它是一种类型而不是值。
这里有更多信息:
我当然遗漏了一些东西,但我不明白为什么这会编译(同时使用 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
初始化的变量声明,它是一种类型而不是值。
这里有更多信息: