這個問題在這里已經有了答案: 非 const 左值參考 2 個回答 7 小時前關閉。
我學習了參考和值類別,因為在一些 C 錯誤中提到了后者。
我有一個函式,referenceToDouble它接受對 double 的參考。從觀賞價值類別這段視頻,我相信,left和right下面是左值參考翻番。
在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哪個是文字,因此是右值?這里不涉及回傳型別嗎?我認為這不是因為這是按值回傳而不是按參考回傳。
我嘗試閱讀有類似錯誤的這個問題的答案,但我無法消除我的疑慮。我也認為我知道解決方案(使用double)是什么,但我試圖了解幕后發生的事情。
uj5u.com熱心網友回復:
是否有一個臨時變數包含從浮點數轉換而來的 a 的雙精度值?這是臨時的然后是右值嗎?
是的。left而rightwith typedouble&不能float直接系結到s。它們必須double首先轉換為s,它們是臨時的(右值)并且不能系結到非常量的左值參考。
如果更改的型別left,并right以const double&然后它會正常作業。轉換后的double臨時物件(右值)可以系結到左值參考const。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/397874.html
下一篇:C 如何“取消使用”庫參考?
