C++ 哪一个更好,auto&&;,自动或自动常数

C++ 哪一个更好,auto&&;,自动或自动常数,c++,c++14,C++,C++14,如果我有这样的类型 std::vector<int> const value = ... 风格2: for(auto &&v : value){ //do something } 风格3: for(auto const v : value){ //do something } 它们都保持了这种类型的恒定性 样式2是最通用的解决方案 据我所知,对于int、double等基元类型,pass-by-value优于pass-by-const-reference,

如果我有这样的类型

std::vector<int> const value = ...
风格2:

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

for(auto const v : value){
  //do something
}
它们都保持了这种类型的恒定性

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


据我所知,对于int、double等基元类型,pass-by-value优于pass-by-const-reference,因此如果我们知道向量的类型是基元类型,那么我认为样式1和样式3比样式2更好。如果这个问题听起来很愚蠢,请原谅。

这取决于您的需要和您反复讨论的内容

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

然后你必须决定你是否是默认的const成员之一。如果是,请选择样式3


样式2确实是最通用的,但不一定是好的。除非您想从元素进一步移动,否则对现场生成的序列进行非常量引用没有什么意义,即:

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


如果你查看C++核心指南,你就不会看到任何例子,比如<代码> Auto&&和代码>,他们建议默认使用<代码> const和< />代码,除非你要修改变量。这就是我要坚持的。

以什么方式更好呢?对于
对于(auto const v:value){
你的意思是
对于(const auto&v:value){
?因为const值似乎没有太多意义。我想这里也有合理的答案:它也包括
const auto&
for(auto&& x : std::vector<int>{1,2,3})
{
    // x = 42; ???
}