为了账号安全,请及时绑定邮箱和手机立即绑定

基于C ++ 11范围的循环:按值获取项目或引用const

基于C ++ 11范围的循环:按值获取项目或引用const

C++
慕莱坞森 2019-09-18 19:19:53
读取基于范围环的一些例子他们建议两种主要方式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何时使用原始项目,不会修改它们。


查看完整回答
反对 回复 2019-09-18
?
HUWWW

TA贡献1874条经验 获得超12个赞

当我们不需要更改vec项目时,示例建议使用第一个版本。


然后他们给出了错误的建议。


为什么他们不建议const引用的东西


因为他们给出了错误的建议:-)你提到的是正确的。如果您只想观察一个对象,则无需创建副本,也不需要对其进行非const引用。


编辑:


我看到你链接的引用都提供了迭代一系列int值或一些其他基本数据类型的示例。在这种情况下,由于复制int并不昂贵,因此创建副本基本上等同于(如果不是更有效)进行观察const &。


但是,对于用户定义的类型,通常不是这种情况。复制UDT可能很昂贵,如果您没有理由创建副本(例如修改检索到的对象而不更改原始副本),则最好使用a const &。


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 478 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信