如果我有这样的类型
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好原始类型。如果这个问题听起来很愚蠢,请原谅我。
答案 0 :(得分:6)
这实际上取决于您的需求以及您正在迭代的内容。
样式1和3制作元素的副本。这意味着您无法更改原始容器。对于小型类型,它在性能方面可能是有益的(基于您的目标架构进行基准测试),但通常只是一个错误的默认值。
然后你必须决定你是否是 const默认的人之一。如果是,请采用样式3。
风格2确实是最通用的,但不一定是好的方式。除非你想进一步从元素中移出,否则对现场生成的序列采用非常量引用几乎没有意义,即:
for(auto&& x : std::vector<int>{1,2,3})
{
// x = 42; ???
}
如果您查看C ++核心指南here和here,您将看不到auto&&
的示例,他们建议默认情况下使用const&
,除非您要去修改变量。这就是我坚持的。