質問は十分明確だと思います。ウィルautoキーワードのconstネスを自動検出、または常に例えばがあっても、非const型を返します。関数の2つのバージョン(1つは戻るものconst、もう1つは返さないもの)。
念のため、const auto end = some_container.end()forループの前に使用しますが、これが必要かどうか、または通常とは異なるかどうかはわかりませんauto。
回答:
多分あなたは混乱しているconst_iteratorとconst iterator。最初の要素はconst要素を反復処理し、2番目の要素はoperators++と-を使用できないため、まったく反復処理できません。
から繰り返すことはめったにないことに注意してくださいcontainer.end()。通常、以下を使用します。
const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
const auto、この一般的な場合に役立ちますか?
const auto x = expr;
とは異なり
auto x = expr;
なので
const X x = expr;
とは異なり
X x = expr;
だから、使用const autoしてconst auto&、あなたが持っていなかったならばちょうどあなたのように、多くのことをauto。
過負荷の解決は戻り値の型の影響を受けません。constまたはconst、左辺値のnoは、でx呼び出される関数に影響しませんexpr。
const。変数を変更しない(または変更する予定がない)場合は、宣言する必要があります。
2つのテンプレートがあるとします。
template<class U> void f1( U& u ); // 1
template<class U> void f2( const U& u ); // 2
auto型を推定し、変数はパラメーターと同じ型になりu(// 1ケースの場合のように)、const auto変数はパラメーターuの// 2場合と同じ型になります。したがって、修飾子をconst auto強制constするだけです。
コンパイラーは、自動修飾子のタイプを推測します。推定型がsome_type、の場合、const autoに変換されconst some_typeます。ただし、優れたコンパイラはauto変数のスコープ全体を調べて、その値がどこかで変化するかどうかを確認します。そうでない場合、コンパイラ自体は次のように型を推測します:auto-> const some_type。Visual Studio Express 2012でこれを試しましたが、生成されるマシンコードはどちらの場合も同じですが、すべてのコンパイラがこれを実行するかどうかはわかりません。ただし、次のconst auto3つの理由から使用することをお勧めします。
constれない場合、あなたはコンパイラを助けますauto。constためauto 、それはどのような方法でプログラムの機能を変更していない場合。これには、constおよびnon-constメンバー関数が使用可能かどうかのチェックも含まれます。コンパイラはそれを正しく行います。
cbegin値でをcend返しconst_iteratorます。const autoまだ目的があり、冗長ではありません。