web-dev-qa-db-ja.com

「const auto」には意味がありますか?

質問は十分に明確だと思います。 autoキーワードは、const-nessを自動検出しますか。関数の2つのバージョン(constを返すものと返さないもの)。

記録のためだけに、forループの前にconst auto end = some_container.end()を使用しますが、これが必要なのか、通常のautoと異なるのかはわかりません。

70
rubenvb

_const_iterator_と_const iterator_を混同しているのかもしれません。最初の要素はconst要素を反復し、2番目の要素はoperators ++および-を使用できないため、まったく反復できません。

container.end()から反復することはほとんどないことに注意してください。通常は次を使用します。

_const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
_
26
Benoit
const auto x = expr;

とは異なり

auto x = expr;

として

const X x = expr;

とは異なり

X x = expr;

したがって、const autoおよびconst auto&たくさん、あなたがautoを持っていなかった場合と同じように。

オーバーロードの解決は戻り値の型の影響を受けません。左辺値constconstまたはno xは、exprで呼び出される関数には影響しません。

85
antonakos

次の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 autoconst修飾子を強制します。

コンパイラは、自動修飾子のタイプを推測します。推定タイプがsome_typeの場合、const autoconst some_typeに変換されます。ただし、優れたコンパイラーはauto変数のスコープ全体を調べ、その値がどこかで変化するかどうかを調べます。そうでない場合、コンパイラ自体はauto-> const some_typeのような型を推測します。 Visual Studio Express 2012でこれを試しましたが、生成されるマシンコードはどちらの場合も同じです。すべてのコンパイラがそれを行うかどうかはわかりません。ただし、次の3つの理由からconst autoを使用することをお勧めします。

  • コーディングエラーの防止。この変数は変更しないように意図されていますが、その範囲内のどこかで変更されます。
  • コードの可読性が向上しました。
  • 何らかの理由でconstautoを推定できない場合は、コンパイラを支援します。
2
BJovke