【发布时间】:2019-07-15 14:21:02
【问题描述】:
此代码导致编译错误(最令人头疼的解析)
#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;
}
为什么这不被认为是最令人烦恼的解析?这两个代码版本有什么区别?
【问题讨论】:
-
这基本上就是on Wikipedia的例子。第二种情况并不麻烦,因为
20不能是变量名。
标签: c++ c++11 most-vexing-parse