首页 > 解决方案 > 这两个版本的代码有什么区别?

问题描述

此代码导致编译错误(最烦人的解析)

#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而不是testA(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;
}

为什么这不被认为是最令人烦恼的解析?这两个代码版本有什么区别?

标签: c++c++11most-vexing-parse

解决方案


变量可以定义为

type(name)

正因为如此

B var(A(test)); 

声明一个名为的函数,该函数var返回 aB并接受一个A命名的test. 在

B var(A(20));

如果你试图做同样的事情,A参数将被调用20,这不是一个有效的变量名。由于它不能是变量的名称,我们知道它是一个值,而是构造一个名为vartype的变量B,其值为A(20)


推荐阅读