C 11:为什么RVALUE参考参数隐式转换为LVALUE

C++11: Why rvalue reference parameter implicitly converted to lvalue

本文关键字:转换 LVALUE 参数 参考 为什么 RVALUE      更新时间:2023-10-16

以下是我问题的简单代码,

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));
}