範囲ベースのループ: 値またはconstへの参照でアイテムを取得しますか? 質問する

範囲ベースのループ: 値またはconstへの参照でアイテムを取得しますか? 質問する

範囲ベースのループの例をいくつか読むと、主に2つの方法が示唆されている。 1234

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 の例は 2 番目のバージョン (値による) を使用することを示唆しています。参照するものを提案しないのはなぜでしょうか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?

ベストアンサー1

アイテムを変更せず、コピーも避けauto const &たい場合は、これが正しい選択です。

for (auto const &x : vec)

使用を勧める人は誰でauto &あれ間違っています。無視してください。

要約すると次のようになります:

  • auto xコピーを操作するタイミングを選択します。
  • auto &xオリジナルのアイテムをいつ操作し、変更するかを選択します。
  • auto const &x元のアイテムをそのまま使用し、変更しない場合に選択します。

おすすめ記事