我当然缺少一些东西,但是我不明白为什么会这样编译(同时使用g ++和clang ++):
struct A
{
};
struct B
{
};
int main()
{
A a(B);
}
首先,B
是类型...不是值。我应该如何解释此代码?
它被解释为名为a
的函数的声明,该函数接受一个类型为B
的参数并返回A
。
此问题称为most vexing parse。 A a(B);
行可以解释为名为a
的函数的声明,该函数返回A
类型的对象并采用B
类型的未命名参数。
避免此问题的一种方法是使用C ++ 11中引入的统一初始化语法,该语法包括使用花括号而不是括号:A a{B};
返回错误。现在,该行被解释为以B
初始化的变量声明,该声明是类型而不是值。
这里是更多信息:
这只是一个函数声明,它声明a
是返回A
并接受一个B
类型的未命名参数的函数。
这是有效的,因为在函数定义中允许使用与函数定义相反的函数声明。