質問は十分明確だと思います。ウィル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 auto
3つの理由から使用することをお勧めします。
const
れない場合、あなたはコンパイラを助けますauto
。const
ためauto
、それはどのような方法でプログラムの機能を変更していない場合。これには、constおよびnon-constメンバー関数が使用可能かどうかのチェックも含まれます。コンパイラはそれを正しく行います。
cbegin
値でをcend
返しconst_iterator
ます。const auto
まだ目的があり、冗長ではありません。