我对X&& x = static_cast< X&&>(obj_x);就是说,尽管如此,x最终成为一个普通的左值参考.我最近遇到了
this article,其中Scott Meyers坚持认为x将是左值类型参考值的左值.这真的有意义,还是没有区别的区别?具体来说,给定
X&& x = static_cast<X&&>(obj_x)
要么
X& x = obj_x;
是否有任何后续代码对x的这两个定义表现不同?
最佳答案 重要的区别在于R值引用是命名还是未命名(返回值).
所以,为了回答问题所写,不,没有后续代码会不同地处理x的两个定义(除了cpplearner提到的,decltype()).只有x的定义才能在引用可以绑定的内容中起作用(有助于Web搜索的奇特术语).
任何带有名称的东西都可以再次引用,因此它被视为l值,用于绑定到后续引用.为什么?因为r值引用的主要原因是允许移动某些内容.从它移开后,它已不再可行.你所能做的就是销毁它或分配它.如果这个东西没有名字就没什么大不了的,但是如果它有一个名字,很容易意外再次使用它.这就是为什么你需要调用std :: move(mything)来移出我的东西[除了在某些返回情况下].
我认为这是Herb Sutter的一篇文章让我得到了这个细节,遗憾的是我现在找不到它.如果我记错了,可能是Stephan T Lavavej.