这段代码导致编译错误(最烦人的解析)
#include <iostream>
class A {
int a;
public:
A(int x) :a(x) {}
};
class B {
public:
B(const A& obj) { std::cout << "B\n";}
void foo() {std::cout << "foo\n";}
};
int main()
{
int test = 20;
B var(A(test)); //most vexing parse
var.foo();
return 0;
}
但是如果我通过 20
而不是 test
(A(20)
而不是 A(test)
), 没有编译错误。
#include <iostream>
class A {
int a;
public:
A(int x) :a(x) {}
};
class B {
public:
B(const A& obj) { std::cout << "B\n";}
void foo() {std::cout << "foo\n";}
};
int main()
{
int test = 20;
//B var(A(test));
B var(A(20)); //ok works fine
var.foo();
return 0;
}
为什么这不被认为是最令人烦恼的解析?这两个代码版本有什么区别?
最佳答案
变量可以这样定义
type(name)
因为这样
B var(A(test));
声明一个名为 var
的函数,它返回一个 B
并接受一个名为 test
的 A
。在
B var(A(20));
如果您尝试做同样的事情,A
参数将被称为 20
,这不是一个有效的变量名。由于它不能是我们知道它是一个值的变量的名称,因此我们正在构造一个名为 var
的 B
类型的变量,其值为 A( 20)
。
关于c++ - 这两个版本的代码有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54810991/