【发布时间】:2015-12-27 19:56:22
【问题描述】:
以下内容无法编译:
#include <iostream>
using namespace std;
int x = 5;
int && f () { return std::move(x); }
int g(int & y) { return y; }
int main() {
g(f());
return 0;
}
我很清楚为什么prvalues(未命名的临时变量)不绑定到非常量左值引用——修改它们没有意义,因为它们很快就会消失。但是为什么 xvalues 不绑定到非 const 左值引用?
如果函数返回int &&,则引用的对象不能是临时的,否则我们会得到一个悬空引用。因此,如果返回 int &&,在我的理解中,这是一个额外保证可以安全移出它的引用。
编辑:措辞更正:“值”绑定到“引用”,反之亦然。
第二次编辑:以下编译——我看不出概念上的区别,除了 y 现在是一个左值。然而它仍然引用 x。根据语言规范,我理解为什么这应该编译而上述内容不应该编译。但是,我不明白其背后的原因。为什么单纯的锯齿会改变图片?
#include <iostream>
using namespace std;
int x = 5;
int && f () { return std::move(x); }
int g(int & y) { return y; }
int main() {
int && y = f(); // reference!
g(y); // compiles
// check that y indeed references x
y = 7;
std::cout << x << std::endl; // prints 7, of course
return 0;
}
第三次编辑:简而言之,不允许背后的想法是什么
int && f() { ... }
int g (int & y) { ...}
g(f());
允许
int && f() { ... }
int g (int & y) { ...}
int & k (int && y) { return y; }
g(k(f()));
【问题讨论】:
-
re“不能是临时的”,考虑
auto f( int&& x ) -> int&& { return move(x); } -
请注意,给定
struct A { int x; };,A().x是一个 xvalue,每个 CWG DR 616。 -
@Cheersandhth.-Alf 我认为(但如果我错了,请纠正我)OP 并不是说 xvalues 不可能引用临时变量,而是你的示例函数已经应该不能这样写,这是一个糟糕的函数定义,因为它允许返回即将悬空的引用。
-
我认为“绑定到 xvalue”这个术语没有意义。值绑定到引用,这是语言中唯一存在的相关概念。
-
@hvd:这将使 OP 的推理循环。
标签: c++ c++11 rvalue-reference