C 11:为什么RVALUE参考参数隐式转换为LVALUE
C++11: Why rvalue reference parameter implicitly converted to lvalue
以下是我问题的简单代码,
void overloaded (int&& x) {
cout << "[rvalue]";
}
template <class T>
void fn (T&& x) {
overloaded(x);
}
int main() {
fn(0);
return 0;
}
我有一个编译错误
无法将"
int
" lvalue绑定到'int&&
'overloaded(x);
我在这里感到困惑,x
作为RVALUE参考传递到fn()
中。但是,为什么overload()
在fn()
中调用x
是lvalue?
您不是将 x
作为rvalue参考&quot&quot&quot&quot&quot&quot&quot&quot&quot&quot'
以下是有关C 类型和表达式分类法的选择:
-
有对象类型,并且有参考类型。(还有其他几种类型。(
-
变量可以是对象或参考。
-
表达式具有类型,这些类型是(几乎(总是对象类型,从不引用。(这就是为什么您对"将某些事物作为参考的说法没有意义没有意义的原因;您通过参数 ,而参数始终是表达。(表达可以是lvalues,xvalues或prvalues。
。 -
lvalue参考与lvalues结合。RVALUE参考与RVALUE结合。(rvalue是prvalue或xvalue。(
-
ID表达命名变量或参数是LVALUE。(如果愿意
因此,在表达式overloaded(x)
中,子表达x
是一个LVALUE,它不与期望rvalue的函数结合(由于其RVALUE参考参数(。
" l&quot"answers" R&quot"在" lvalue参考"中和" rvalue参考"是指参考可以绑定的值类别, to in ID表达式命名此参考类型的变量。
您可以通过将其施放到xvalue来转换为rvalue;这很方便地封装在类型的铸造辅助辅助std::move
中。
一个, x
fn
的参数不是r-value参考,它是"通用引用"(是的,这很混乱(。
二,当您给对象一个名称时的那一刻,该名称不是R值,除非明确"固定",否则使用std::move
(将其作为R-Value参考,始终(或使用std::forward
(用于转换(转换(它可以回到通用引用的情况下的原始类型(。如果要避免投诉,请使用std::forward
作为原始类型进行转发:
template <class T>
void fn (T&& x) {
overloaded(std::forward<T>(x));
}
- 防止主数据类型C++的隐式转换
- 对RValue对象调用的LValue ref限定成员函数
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 未执行lvalue到rvalue转换
- C 11:为什么RVALUE参考参数隐式转换为LVALUE
- Lvalue和Literal之间的比较是否调用Lvalue到Rvalue的转换
- C :RVALUE参考转换为非const lvalue-Reference
- 使用强制转换时prvalue和lvalue之间的差异