我学习了引用和值类别,因为后者在一些 C++ 错误中被提及。
我有一个函数,referenceToDouble
它接受对双精度的引用。通过观看有关值类别的视频left
,我相信right
以下是对 double 的左值引用。
在main
我制作变量a
和b
类型double
时,我没有收到错误。下面的代码显示a
和b
类型float
,这给了我一个错误。
#include <cassert>
double referenceToDouble(double& left, double& right) {
if (left >= right) {
right = left;
}
else {
left = right;
}
return left;
}
int main() {
float a = 55.5;
float b = 55.5;
assert(55.5 == referenceToDouble(a, b));
}
当我将a
和的数据类型切换b
为 时float
,出现此错误。
checkReferences.cpp: In function 'int main()':
checkReferences.cpp:18:35: error: cannot bind non-const lvalue reference of type 'double&' to an rvalue of type 'double'
18 | assert(55.5 == referenceToDouble(a, b));
| ^
checkReferences.cpp:3:34: note: initializing argument 1 of 'double referenceToDouble(double&, double&)'
3 | double referenceToDouble(double& left, double& right) {
| ~~~~~~~~^~~~
我的问题是:
右值来自哪里?
是否有一个临时变量包含 从中转换的
double
值?这是暂时的吗?a
float
rvalue
或者错误是指
55.5
which 是文字,因此是右值?这里不涉及返回类型吗?我认为这不是因为这是按值返回而不是按引用返回。
我尝试阅读有类似错误的这个问题的答案,但我无法消除我的疑虑。我也认为我知道解决方案(使用double
)是什么,但我试图了解引擎盖下发生了什么。