c++ - 这两个版本的代码有什么区别?
问题描述
此代码导致编译错误(最烦人的解析)
#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
返回 aB
并接受一个A
命名的test
. 在
B var(A(20));
如果你试图做同样的事情,A
参数将被调用20
,这不是一个有效的变量名。由于它不能是变量的名称,我们知道它是一个值,而是构造一个名为var
type的变量B
,其值为A(20)
。
推荐阅读
- typescript - 不可分配给类型“字符串”。类型 'void' 不可分配给类型 'string'
- javascript - 在画布的同位点上对两种类型的节点进行分组
- node.js - node.js express:如何制作文件夹选择器?
- c - code::blocks 动画/自动单步源
- php - 删除关联数组中的父元素
- android - 从图库中选择照片(onActivityResult() 问题 - 我是这么认为的)- Fragment Android
- blogger - 我错误地删除了博客中的标题小部件。我该如何重新安装它?
- javascript - 使用没有窗口对象的 window.AudioContext
- sql - 如何根据列中的值禁用 oracle apex 中的链接
- python - 在 sympy 中获取复杂表达式的系数