`const auto`には何か意味がありますか?


82

質問は十分明確だと思います。ウィルautoキーワードのconstネスを自動検出、または常に例えばがあっても、非const型を返します。関数の2つのバージョン(1つは戻るものconst、もう1つは返さないもの)。

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

回答:


31

多分あなたは混乱しているconst_iteratorconst iterator。最初の要素はconst要素を反復処理し、2番目の要素はoperators++と-を使用できないため、まったく反復処理できません。

から繰り返すことはめったにないことに注意してくださいcontainer.end()。通常、以下を使用します。

const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }

12
cbegin値でをcend返しconst_iteratorます。const autoまだ目的があり、冗長ではありません。
dalle 2011

2
それでconst auto、この一般的な場合に役立ちますか?
rubenvb 2011

@dalle:コメントする前に段落を削除しました。私が無意味なことを言ったことに気づきました:)
Benoit

2
誰かがSQLを書きすぎています。:)
Andres Jaan Tack

3
autoは&のようにconstによって変更され、foreachで使用できます。例:en.cppreference.com/w/cpp/language/auto
Janosimas 2015

97
const auto x = expr;

とは異なり

auto x = expr;

なので

const X x = expr;

とは異なり

X x = expr;

だから、使用const autoしてconst auto&、あなたが持っていなかったならばちょうどあなたのように、多くのことをauto

過負荷の解決は戻り値の型の影響を受けません。constまたはconst、左辺値のnoは、でx呼び出される関数に影響しませんexpr


17
いいえconst。変数を変更しない(または変更する予定がない)場合は、宣言する必要があります。
Paul J. Lucas

7

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するだけです。


3

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

  • コーディングエラーの防止。この変数は変更しないように意図していましたが、スコープ内のどこかで変更されています。
  • コードの可読性が向上します。
  • 何らかの理由でそれが推論さconstれない場合、あなたはコンパイラを助けますauto

コンパイラは、可能であればconstを推定しません...型を推定している式がすでにそれ自体でconstである場合にのみ、constを追加します。コンパイラが可能にするためにconstを追加するだけの場合、特定のコンパイラがconstを推測できるかどうかに応じて、constとnon-constのメンバー関数が呼び出されるなど、プログラムのセマンティクスが壊れることがあります。ですから、最後のポイントは間違っていると思います。
rubenvb 2016

@rubenvb C ++標準では、コンパイラーは、必要な最適化に応じて、コードを適切な方法で再編成できます。コンパイラが推測することは完全に合法であるconstためauto 、それはどのような方法でプログラムの機能を変更していない場合。これには、constおよびnon-constメンバー関数が使用可能かどうかのチェックも含まれます。コンパイラはそれを正しく行います。
bJovke 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.