1. ホーム
  2. c++

[解決済み] 範囲ベースのforループで転送参照を使用する利点は何ですか?

2022-05-11 11:12:58

質問

const auto& は、私が読み取り専用の操作を実行したい場合、十分である。しかし、私は

for (auto&& e : v)  // v is non-const

を最近何度か使っています。これを見ると、不思議な気持ちになります。

いくつかの不明瞭なコーナーケースにおいて、転送参照を使用することでパフォーマンス上の利点がある可能性があります。 auto& または const auto& ?

( shared_ptr は、不明瞭なコーナーケースのための容疑者です)


更新 お気に入りで見つけた2つの例。

基本的な型を反復するときに const 参照を使用することの不利な点はありますか?

範囲ベースのforループを使用して、マップの値を簡単に反復処理することはできますか?

質問に集中してください。 なぜ範囲ベースのforループでauto&&を使用したいのでしょうか?

どのように解決するのですか?

唯一の利点は、シーケンスイテレータがプロキシ参照を返し、その参照に対して非恒等式に操作する必要がある場合です。 例えば考えてみましょう。

#include <vector>

int main()
{
    std::vector<bool> v(10);
    for (auto& e : v)
        e = true;
}

これはコンパイルされません。 vector<bool>::reference から返される iterator から返される は const でない lvalue の参照には束縛されません。 しかし、これは動作します。

#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&& が最適な解決策になると思います。