在C++中,说一个变量具有rvalue引用类型是否有意义?

4
我对类似 X&& x = static_cast<X&&>(obj_x); 的语句的理解是,尽管外表上看起来不同,但实际上x最终仍然是一个普通的左值引用。我最近阅读了Scott Meyers写的这篇文章,他坚称x会成为一个右值引用类型的左值。这个区别真的有意义吗?还是说只是纯粹的区分而已?具体来说,无论给定哪种情况。
X&& x = static_cast<X&&>(obj_x)

或者

X& x = obj_x;

这两个定义的 x 会有任何后续代码表现不同的情况吗?


1
decltype(x)。如果x是一个非静态数据成员,它还会影响拷贝构造函数的生成。 - cpplearner
为什么不把这个评论变成一个答案呢? - Ari
1个回答

1
重要的区别在于R值引用是有名还是无名(返回值)。因此,回答这个问题,不,没有后续代码会以不同方式处理x的两个定义(除了cpplearner提到的decltype())。只有x的定义会影响引用可以绑定到的内容(这个花哨的术语将帮助网络搜索)。任何有名称的东西都可以再次引用,因此它被视为l值以便于绑定到后续引用。为什么?因为r值引用的主要原因是使某些东西能够被移动。移动之后,它就不再可行了。你所能做的就是销毁它或对其进行分配。如果这个东西没有名字,那没什么大不了的,但如果它有名字,很容易意外地再次使用它。这就是为什么你需要调用std::move(mything)来移出mything [除了一些返回情况]。我想是Herb Sutter的一篇文章让我注意到这个细节,不幸的是我现在找不到它了。如果我记错了,可能是Stephan T Lavavej写的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接