Rvalues不能用于初始化左值(正常)引用。但是如果我写一个辅助转换函数,它就可以了。在后台发生了什么,是否可能有危险?
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
答案 0 :(得分:1)
您的代码调用未定义的行为。 ten+8
创建一个临时文件,其生命周期结束于它出现的完整表达式的末尾(在您的情况下为分号)。 getLvalueRef
然后返回对此临时的引用。
不允许使用此引用超过创建ten+8
的完整表达式。