就读取POD /短C的L2缓存未命中而言,结构集合for (auto&& e : a)比for (auto& e : a)代码生成方式更有效,又如何实现?
根据标准:
基于范围的
for陈述相当于:Run Code Online (Sandbox Code Playgroud){ auto && __range = range-init; for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } }
所以差异for (auto&& e : a)和for (auto& e : a)减少差异:
auto&& e1 = *__begin;
auto& e2 = *__begin;
Run Code Online (Sandbox Code Playgroud)
如果*__begin可以绑定到左值引用,则两者是等价的.e1并且e2将在任何符合标准的编译器上推导出相同的左值引用类型,并且生成的代码应该是相同的.
但是,如果这样的绑定是不可能的(例如a,类型vector<bool>为Best.Container.永远.),那么e2类型推断将失败,并且只有e1版本才有效.
所以这不是一个更高效的问题.auto& e仅在有效的案例子集中auto&& e有效(后者在任何范围表达式有效的所有情况下都有效).如果auto& e有效,那么它完全等同于auto&& e.