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