我正在学习引用和值类别,因为后者在一些C++错误中被提到。
我有一个函数
在
当我将
我有一个函数
referenceToDouble
,它接受对double的引用。从观看this video on value categories,我相信下面的left
和right
是指向double的左值引用。在
main
中,当我创建类型为double
的变量a
和b
时,我不会出现错误。下面的代码显示了类型为float
的a
和b
,这给了我一个错误。#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) {
| ~~~~~~~~^~~~
我的问题是:
rvalue是从哪里来的?
是否有一个临时变量包含从
float
转换而来的a
的double
值?这个临时变量是否是rvalue
?还是错误指的是
55.5
,它是一个字面量,因此是rvalue?返回类型在这里没有参与吗?我认为不是,因为这是按值返回而不是按引用返回。
我尝试了阅读类似错误的答案,但我无法消除我的疑虑。我也认为我知道解决方案(使用double
),但我正在尝试理解底层发生了什么。
double
右值。你使用的是哪个特定的编译器? - David Graysong++
,更具体地说是g++ (GCC) 9.3.1 20200408
。 - heretoinfinity