如果我有这样的类型
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.如果这个问题听起来很愚蠢,请原谅我.
这实际上取决于您的需求和您正在迭代的内容.
样式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&默认采用,除非您要修改变量.这就是我坚持的.