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

时间:2016-10-19 03:33:43

标签: c++ c++14

如果我有这样的类型

std::vector<int> const value = ...

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

风格1:

for(auto v : value){
  //do something
}

风格2:

for(auto &&v : value){
  //do something
}

风格3:

for(auto const v : value){
  //do something
}

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

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

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

1 个答案:

答案 0 :(得分:6)

这实际上取决于您的需求以及您正在迭代的内容。

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

然后你必须决定你是否是 const默认的人之一。如果是,请采用样式3。

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

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

如果您查看C ++核心指南herehere,您将看不到auto&&的示例,他们建议默认情况下使用const&,除非您要去修改变量。这就是我坚持的。