c++ - 为什么 xvalue 不绑定(bind)到非常量左值引用?

标签 c++ c++11 rvalue-reference

以下内容无法编译:

#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/

相关文章:

c++ - ‘virtual char std::ctype<wchar_t>::do_narrow(wchar_t, char) const’ protected

c++ - 是否可以调用一个以 const 右值作为参数的函数?

c++ - 是否可以将 std::move 对象移出函数? (C++11)

带有枚举的 C++ Visual Studio 调试器错误

c++ - 黑屏视频采集opencv

c++ - 时间测量在 C++ 中不起作用

C++ 调用错误时没有匹配的函数

regex - GCC 4.9 支持正则表达式的哪一部分?

c - 如果我将负值赋给 unsigned char 会发生什么?

C++0x 右值引用模板参数推导