哪一个更好,auto &&,auto或auto const

Ste*_*ing 2 c++ c++14

如果我有这样的类型

std::vector<int> const value = ...
Run Code Online (Sandbox Code Playgroud)

哪一个是更好的解决方案?

风格1:

for(auto v : value){
  //do something
}
Run Code Online (Sandbox Code Playgroud)

风格2:

for(auto &&v : value){
  //do something
}
Run Code Online (Sandbox Code Playgroud)

风格3:

for(auto const v : value){
  //do something
}
Run Code Online (Sandbox Code Playgroud)

所有这些都保持了类型的常量.

样式2是最通用的解决方案.

根据我所知,对于像int,double等原始类型,传递值更喜欢通过const引用传递,所以我认为如果我们知道向量的类型是原始类型,则样式1和样式3优于样式2.如果这个问题听起来很愚蠢,请原谅我.

krz*_*zaq 6

这实际上取决于您的需求和您正在迭代的内容.

样式1和3构成元素的副本.这意味着您无法更改原始容器.对于小型类型,它在性能方面可能是有益的(在您的目标架构上进行基准测试),但通常只是一个不好的默认值.

然后你必须决定你是否是默认情况下const之一.如果是,请采用样式3.


风格2确实是最通用的,但不一定是好的方式.除非你想进一步从元素移动,否则对现场生成的序列采用非const引用是没有意义的,即:

for(auto&& x : std::vector<int>{1,2,3})
{
    // x = 42; ???
}
Run Code Online (Sandbox Code Playgroud)

如果您在此处此处查看C++核心指南,您将看到没有示例,auto&&并且他们建议const&默认采用,除非您要修改变量.这就是我坚持的.