读取基于范围环的一些例子他们建议两种主要方式1,2,3,4std::vector<MyClass> vec;for (auto &x : vec){ // x is a reference to an item of vec // We can change vec's items by changing x }要么for (auto x : vec){ // Value of x is copied from an item of vec // We can not change vec's items by changing x}好。当我们不需要更改vec项目时,IMO,示例建议使用第二个版本(按值)。为什么他们不建议const引用的东西(至少我没有找到任何直接的建议):for (auto const &x : vec) // <-- see const keyword{ // x is a reference to an const item of vec // We can not change vec's items by changing x }不是更好吗?它是不是避免了每次迭代中的冗余副本,而它是一个const?
3 回答
繁星coding
TA贡献1797条经验 获得超4个赞
如果您不想更改项目以及想要避免复制,那么这auto const &
是正确的选择:
for (auto const &x : vec)
建议你使用的人auto &
是错的。别管他们。
这是概述:
选择
auto x
何时使用副本。选择
auto &x
何时使用原始项目并可以修改它们。选择
auto const &x
何时使用原始项目,不会修改它们。
HUWWW
TA贡献1874条经验 获得超12个赞
当我们不需要更改vec项目时,示例建议使用第一个版本。
然后他们给出了错误的建议。
为什么他们不建议const引用的东西
因为他们给出了错误的建议:-)你提到的是正确的。如果您只想观察一个对象,则无需创建副本,也不需要对其进行非const引用。
编辑:
我看到你链接的引用都提供了迭代一系列int值或一些其他基本数据类型的示例。在这种情况下,由于复制int并不昂贵,因此创建副本基本上等同于(如果不是更有效)进行观察const &。
但是,对于用户定义的类型,通常不是这种情况。复制UDT可能很昂贵,如果您没有理由创建副本(例如修改检索到的对象而不更改原始副本),则最好使用a const &。
- 3 回答
- 0 关注
- 503 浏览
添加回答
举报
0/150
提交
取消