【发布时间】:2012-02-29 05:15:50
【问题描述】:
据我了解,从函数返回右值引用很危险的原因是由于以下代码:
T&& f(T&& x) { do_something_to_T(x); return static_cast<T&&>(x); }
T f(const T& x) { T x2 = x; do_something_to_T(x2); return x2; }
T&& y = f(T());
这使y 成为未定义的悬空引用。
但是,我不明白为什么上面的代码甚至可以编译?是否有合理的理由将右值引用分配给另一个右值引用?粗略地说,右值不应该是“临时变量”,即在表达式的末尾将变为无效吗?能够分配它们对我来说似乎很愚蠢。
【问题讨论】:
-
Eric Lippert 谈到了实现一个允许在 this post 中返回 ref 的 C# 变体,并且还涵盖了由此产生的许多用例。
-
哪个编译器编译它? o.O... 因为它不能编译 - 你不能用
T初始化T&&。 -
@AzzA:呃,你可以用右值初始化一个右值引用,这就是它们的全部意义。
-
另外,这是通常的引用绑定。你必须能够绑定引用,所以这个问题看起来很傻。
-
@CatPlusPlus 但是这个特定的代码不能编译:没有转发...你需要
return std::forward<T>(x);。
标签: c++ c++11 rvalue-reference rvalue