以下内容无法编译:
#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;
}
我很清楚为什么纯右值(未命名的临时变量)不绑定(bind)到非常量左值引用——修改它们没有意义,因为它们很快就会消失。但为什么 xvalue 不绑定(bind)到非常量左值引用?
如果函数返回int &&
,则引用的对象不能是临时的,否则我们将得到一个悬空引用。因此,如果返回一个 int &&
,根据我的理解,这就是一个引用,并额外保证可以安全地从它移动。
编辑:更正措辞:“值”绑定(bind)到“引用”,反之亦然。
第二次编辑:以下编译 - 除了 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()));
最佳答案
因为那会造成困惑。
非 const 左值引用的全部要点在于,它们是非临时对象的别名,这些对象的生命周期已通过其他方式进行管理。右值引用的引入——以及最重要的是,std::move——专门是为了创建一个新的引用“类”,其绑定(bind)表示引用对象最有可能“安全”地移动。
如果这些引用对象也能够绑定(bind)到一个简单的 T&
,那么您将遇到大量不明确的转换错误,并且没有人知道该怎么做。您可以给此类转化一个较低的排名,但我觉得这仍然会非常令人困惑。
因此,您正在向后看。问问自己为什么 xvalues 不绑定(bind)到非常量左值引用。。
关于c++ - 为什么 xvalue 不绑定(bind)到非常量左值引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34484246/