範囲ベースのループの例をいくつか読むと、主に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 の例は 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
元のアイテムをそのまま使用し、変更しない場合に選択します。