哪一个更好,auto&&, auto还是auto const?

3
如果我有这样的类型
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更好。如果我的问题听起来很愚蠢,请原谅我。


2
更好的方式是什么? - Robert Prévost
1
对于 for(auto const v : value){,你是不是想说 for(const auto& v : value){}?因为一个const值似乎没有太多意义。 - Paul Rooney
这里也有一个合理的答案:https://dev59.com/810a5IYBdhLWcg3w3L4-,它也涵盖了`const auto&`。 - Paiusco
1个回答

8

这取决于你的需求和迭代的对象。样式1和3都会复制元素,这意味着你不能更改原容器。对于小类型,这可能在性能方面有益(在目标架构上进行基准测试),但通常是不好的默认值。然后你需要决定你是否属于“默认为const”的人群。如果是,就选择样式3。


样式2确实是最通用的,但不一定是好的。除非你想进一步移动元素,否则将非const引用传递给即时生成的序列没有太多意义:

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

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

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