【问题标题】:Rvalue reference to lvalue reference右值引用到左值引用
【发布时间】:2014-05-13 11:17:26
【问题描述】:

右值不能用于初始化左值(正常)引用。但是,如果我编写一个辅助转换函数,它就可以工作。后台发生了什么,是否有危险?

template <class T>
inline T& getLvalueRef(T&& x)
{
    return x;
}

编译器接受这个。

然后

int ten = 10;
int& ref = getLvalueRef(ten+8);

// use some variables to rewrite memory
int a = 7;
int b = 10;
int c = (a+b)*6;

// check if still works
cout << ref << endl; // okay, still 18
ref = 9;
cout << ref << endl; // okay, 9

【问题讨论】:

  • 据我所知ref 引用了getLvalueRef 中的堆栈变量x,它在ref 之前消失了。我相信'//使用一些变量来重写内存'失败了。虽然不是 100% 确定。

标签: c++11 reference rvalue-reference


【解决方案1】:

您的代码调用了未定义的行为。 ten+8 创建一个临时的,其生命周期在它出现的 full-expression 的末尾结束(在您的情况下,分号)。 getLvalueRef 然后返回对此临时的引用。

不允许在创建ten+8完整表达式之后使用此引用。

【讨论】:

  • 但是请注意,是使用getLvalueRef 而不是导致问题的函数。
  • 谢谢。 1)据我所知,用这样的辅助函数包装一个临时函数以将其传递给一些出于某种原因想要处理非常量引用的库函数可能是有意义的(当然我不是指输出参数) . 2)从您的解释看来,实际上int&amp;SomeType&amp; 可以引用右值。所以我的int&amp; ref 实际上是指那个临时的,即使它似乎是一个左值引用。也许该术语具有误导性,并且 int& 只是一个“参考”,但不会自动接受右值分配。
猜你喜欢
  • 2014-10-31
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
相关资源
最近更新 更多