1. ホーム
  2. c++

[解決済み] [Solved] Range based loop: get item by value or reference to const?

2022-04-02 21:37:09

質問

範囲ベースのループのいくつかの例を読むと、主に2つの方法が提案されています。 1 , 2 , 3 , 4

std::vector<MyClass> vec;

for (auto &x : vec)
{
  // x is a reference to an item of vec
  // We can change vec's items by changing x 
}

または

for (auto x : vec)
{
  // Value of x is copied from an item of vec
  // We can not change vec's items by changing x
}

まあね。

変更する必要がない場合 vec の項目は、IMO、Examplesでは、2番目のバージョン(by value)を使用することを推奨しています。なぜ、彼らは const を参照しています(少なくとも私は、直接的な提案を見つけられませんでした)。

for (auto const &x : vec) // <-- see const keyword
{
  // x is a reference to an const item of vec
  // We can not change vec's items by changing x 
}

その方がいいのでは?でありながら、各反復で冗長なコピーを避けることができるのではないでしょうか? const ?

解決方法は?

項目を変更したくない場合、および 避ける コピーを作成する場合 auto const & が正しい選択です。

for (auto const &x : vec)

を使うように勧める人は auto & は間違いです。無視しましょう。

ここでおさらいです。

  • 選択 auto x は、コピーで作業する場合です。
  • 選択する auto &x オリジナルのアイテムを使用し、それを修正する可能性がある場合。
  • 選ぶ auto const &x オリジナルのアイテムに手を加えない場合。