c++ - 这两个版本的代码有什么区别?

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

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

#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 并接受一个名为 testA。在

B var(A(20));

如果您尝试做同样的事情,A 参数将被称为 20,这不是一个有效的变量名。由于它不能是我们知道它是一个值的变量的名称,因此我们正在构造一个名为 varB 类型的变量,其值为 A( 20)

关于c++ - 这两个版本的代码有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54810991/

相关文章:

java - 是否可以在 JNI 库中将类路径设为 @rpath?

C++矩阵模板类切片

c++ - 使无序初始化 statc 有序

c++ - 在不带参数的函数声明中指定使用 void 是否解决了最令人烦恼的解析问题?

c++ - 有没有办法强制 "most vexing parse"成为错误,即使是逐个类?

c++ - 存在什么样的堆栈展开库,有什么区别?

c++ - 将模板化回调函数传递给另一个模板化函数

c++ - 我的 C++ 可执行文件在 Visual Studio 2008 IDE 之外的运行速度比在内部快得多,即使在发行版中也是如此

c++ - std::unique_ptr 和 std::ostringstream (SIGSEGV) 的奇怪行为

c++ - 为什么此语句不调用构造函数 - C++