質問は十分に明確だと思います。 auto
キーワードは、const-nessを自動検出しますか。関数の2つのバージョン(const
を返すものと返さないもの)。
記録のためだけに、forループの前にconst auto end = some_container.end()
を使用しますが、これが必要なのか、通常の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 x = expr;
とは異なり
auto x = expr;
として
const X x = expr;
とは異なり
X x = expr;
したがって、const auto
およびconst auto&
たくさん、あなたがauto
を持っていなかった場合と同じように。
オーバーロードの解決は戻り値の型の影響を受けません。左辺値const
のconst
またはno x
は、expr
で呼び出される関数には影響しません。
次の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でこれを試しましたが、生成されるマシンコードはどちらの場合も同じです。すべてのコンパイラがそれを行うかどうかはわかりません。ただし、次の3つの理由からconst auto
を使用することをお勧めします。
const
のauto
を推定できない場合は、コンパイラを支援します。