私が見ることができる唯一の利点は、シーケンス反復子がプロキシ参照を返し、その参照を非constな方法で操作する必要がある場合です。たとえば、次のことを考慮してください。
#include <vector>
int main()
{
std::vector<bool> v(10);
for (auto& e : v)
e = true;
}
vector<bool>::reference
から返された右辺iterator
値が非const左辺値参照にバインドされないため、これはコンパイルされません。しかし、これはうまくいきます:
#include <vector>
int main()
{
std::vector<bool> v(10);
for (auto&& e : v)
e = true;
}
そうは言っても、このようなユースケースを満たす必要があることを理解していない限り、この方法でコーディングすることはありません。つまり、あなたが今何をしているのだろうと人々に思わせるので、私はこれを不当に行うことはしません。そして、私がそれをしたとしても、理由についてコメントを含めることは害にはならないでしょう:
#include <vector>
int main()
{
std::vector<bool> v(10);
// using auto&& so that I can handle the rvalue reference
// returned for the vector<bool> case
for (auto&& e : v)
e = true;
}
編集する
私のこの最後のケースは、本当に理にかなったテンプレートであるべきです。ループが常にプロキシ参照を処理していることがわかっている場合は、auto
と同様に機能しauto&&
ます。しかし、ループが非プロキシ参照とプロキシ参照を時々処理していたとき、私auto&&
は選択の解決策になると思います。