gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:01 25 4
gpt4 key购买 nike

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

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com