C++ 为什么不';Xt值绑定到非常量左值引用?

C++ 为什么不';Xt值绑定到非常量左值引用?,c++,c++11,rvalue-reference,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; } 第三次编辑:简言之,不允许的想法是什么 int && f() { ... } int g (int &am

以下内容未编译:

#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;
}
第三次编辑:简言之,不允许的想法是什么

int && f() { ... }
int g (int & y) { ...}
g(f());
int && f() { ... }
int g (int & y) { ...}
int & k (int && y) { return y; }
g(k(f()));
但允许

int && f() { ... }
int g (int & y) { ...}
g(f());
int && f() { ... }
int g (int & y) { ...}
int & k (int && y) { return y; }
g(k(f()));

因为那样会弄得一团糟

非constlvalue引用的全部要点是,它们是非临时对象的别名,其生命周期已经通过其他方式进行管理。右值引用的引入——最重要的是,
std::move
——是为了创建一个新的引用“类”,它的绑定表示引用对象很可能是“安全”的

如果这些引用也能够绑定到一个简单的
T&
,那么就会出现大量模棱两可的转换错误,没有人知道该怎么做。你可以给这样的转换一个较低的等级,但我觉得这仍然是非常混乱的


因此,你是在向后看。问问你自己,为什么XValk不绑定到非const LValk引用。< /P> re“不能是临时的”,考虑<代码> Auto F(int &&x)-int & & {返回移动(x);}注意,给出<代码>结构{{int x;};
A().x
是一个xvalue,per.@chearsandhth.-Alf我认为(如果我错了,请纠正我),OP并不是说xvalue不可能引用临时变量,而是说示例函数已经不应该这样写了,这是一个糟糕的函数定义,因为它允许很快将悬空的引用返回。值绑定到引用,这是语言中唯一存在的相关概念。@hvd:这会使OP的推理循环。我帖子中的措辞是错误的。但我还是不明白。我将试着用一个例子来扩展我的问题。@JohnB:我的答案没有改变。我仍然不明白为什么一个写着“保存以从我处移动”的对象不应该被传递给一个只要求该对象可以修改的函数。@JohnB:首先,你的例子与此不符。它们要么不绑定到您询问的
int&
,要么不说“离开我很安全”。第二,想想大局。这些规则必须在同一个世界中共存,并适合所有情况。