3

我学习了引用和值类别,因为后者在一些 C++ 错误中被提及。

我有一个函数,referenceToDouble它接受对双精度的引用。通过观看有关值类别的视频left,我相信right以下是对 double 的左值引用

main我制作变量ab类型double时,我没有收到错误。下面的代码显示ab类型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值?这是暂时的吗?afloatrvalue

  • 或者错误是指55.5which 是文字,因此是右值?

  • 这里不涉及返回类型吗?我认为这不是因为这是按值返回而不是按引用返回。

我尝试阅读有类似错误的这个问题的答案,但我无法消除我的疑虑。我也认为我知道解决方案(使用double)是什么,但我试图了解引擎盖下发生了什么。

4

1 回答 1

2

是否有一个临时变量包含从浮点数转换的 a 的双精度值?这是暂时的然后是右值吗?

是的。left并且rightwith typedouble&不能float直接绑定到 s 。它们必须double首先转换为 s,它们是临时的(右值),不能绑定到对非 const 的左值引用。

如果您更改 and 的类型,left那么right它将const double&正常工作。转换后的double临时变量(右值)可以绑定到左值引用到const.

于 2021-12-30T01:50:52.120 回答