从函数返回的左值引用实际上是右值(从调用者的角度来看)
Is an lvalue reference returned from a function actually an rvalue (from the perspective of the caller)?
如何让左值引用引用从函数返回的左值引用?从调用方的角度来看,从该函数返回的左值引用实际上不是右值吗?例如:
class Obj {};
Obj& refToRef(Obj& o) {
return o;
}
int main() {
Obj o;
Obj& o2 = refToRef(o);
}
o2
(左值引用(如何能够引用看似右值的内容?
从调用方的角度来看,从该函数返回的左值引用实际上不是右值吗?
否,因为函数调用的结果并不总是右值。
来自 [expr.call]/14(强调我的(:
如果结果类型是左值引用类型或对函数类型的右值引用,则函数调用为左值;如果结果类型是对对象类型的右值引用,则函数调用为 x值;否则为属性值。
我很确定这条规则的存在是为了避免你的问题所问的问题。
在考虑表达式的价值性时,请记住两个属性,身份和移动能力。如果表达式具有名称或地址,则表达式具有标识,如果表达式在计算后将过期,则该表达式是可移动的。
- 左值 = 具有标识且不可移动
- X值 = 具有标识和是可移动的
- Rvalue = 没有标识且可移动
refToRef 通过左值引用返回,因此 refToRef(o)
引用的Obj
是具有标识的对象(&refToRef(o)
已定义(,并且在表达式被计算后仍然存在。 因此,refToRef(o)
是一个左值。
此外,请注意不要将类型与价值混淆。如果我添加一个按值返回的函数并从中创建右值引用,则右值引用将是一个左值。例如
class Obj {};
Obj& refToRef(Obj& o) {
return o;
}
Obj refToVal(Obj& o) {
return o;
}
int main() {
Obj o;
Obj& o2 = refToRef(o);
Obj&& o3 = refToVal(o);
}
o3
具有类型 rvalue refernce to Obj
,并且作为表达式是lvalue
。
相关文章:
- 方法中填充的shared_ptr到map在调用者中返回为空
- C++ 线程端回调并返回结果
- 如何知道 sqlite 中的函数"回调"是否返回了一些东西?
- 从函数返回的左值引用实际上是右值(从调用者的角度来看)
- 是否可以在C 中使回调函数返回值
- 如何在类成员函数中打印调用者对象名称
- std::thread::d etach 在原始调用者被销毁后会导致崩溃
- 将局部变量作为向量的成员传递给被调用者
- 函数调用者如何使用头文件来确定如何处理已编译的二进制文件
- 能否在c++的成员函数中找到调用者?
- 线程问题:控制权没有返回给调用者
- 在异步API (c++)中,如何保证API在调用回调之前返回
- 如何在sublime text 2或3中找到c++函数的所有调用者
- c++返回相同的对象给调用者
- c++11为调用者构造对象
- 在调用者内部扩展被调用者的指导原则是什么(内联-编译器优化)
- Qt获取信号调用者并逐行读取文件
- 在c++中强制调用者捕获返回值并产生编译错误或警告的编译器标志
- c++:可以安全地使用函数内调用者的局部变量
- C++中的strchr如何保证其调用者不会修改作为参数传递的字符串