つの友人は非常に単純な例を示したが、それ自体の最初の要素を押し戻すことができます。コンパイル時にテンプレートの問題を検出する必要があります。この奇妙な行動についてあなたの説明は何ですか?空のベクターは、鉱山の
答えて
これは私にとってコンパイル時の問題ではなく、ランタイムの問題のようです。コンパイラは、どのようにベクトルが動くかを知っていますか?
これはコンパイル時の問題ではないと言います。コンパイル時に、コンパイラはそのベクトルが空であることを知らないか、または気にしません。
実行時に、ベクトルの最初の要素にアクセスしようとすると例外が発生すると予想されます。
'operator []'は境界チェックをしないので、例外は発生しません。 'v [0]'がヌルポインタを間接参照する可能性があるため、シグナル(例外ではない)が発生する可能性があります。このプログラムは、ゴミの塊をベクターに押し込むかもしれません。これは未定義の動作なので、ここで何も起こることはありません。 –
実際、私が「例外」と言ったとき、私は、メモリアクセスエラーが発生する可能性があることを意味しました。もちろん、メモリがどのように割り当てられるかによって異なります。しかし、ポイントが取られました: – icabod
コンパイル 時にテンプレートインスタンス化の問題を検出する必要がありますが、一度インスタンス化すると、インスタンス化の結果は他のクラスまたは関数と同じように正しく動作します( )。表示されている のようなエラーを検出することは一般的に不可能で、結果として実行時に未定義の動作 が発生します。
この状況では、未定義の動作がトリガされます。コンパイラは、それを認識する必要はありませんが、試みることはできます。コンパイラがあなたに警告するか、このコードが実行時の問題を引き起こす可能性があります。そうでないと、何もネガティブではないでしょう。
+1 "それはすることができます"。他の答えはすべて、コンパイラが原則としてこのエラーを検出できないことを前提としています*。それは明らかではありません(真実ではありません)。 –
@Konrad:コンパイラはたくさんのことをチェックできました。しかし、どのようにUBのテストを書いて、それを書いていくのか、あなたはどのように優先順位をつけますか? ''以前に変更されていない ''デフォルトコンストラクタ 'を使った 'ローカルベクトル'の' 'operator []'の '' const expression'の '' const式 'のテストはおそらくいくつかのリストの一番下にあります。それほど有用ではありません。 –
@Martin:これはすべて非常にうまくいきます - そしておそらくそれが行われていない理由です。しかし、原理的にはできないと言っているのと同じではありません。例えば、空ベクトルからの読み取りを禁止することは、副作用のないシステム(すなわち、不変ベクトルを用いる)において、概念的に非常に単純である。 –
実行時でも、このコードの動作は未定義です。ベクタに誤ってバインドされている場合に、(エラーのフラグを立てる例外の形で)確定的な動作を行うには、vector::operator[]
の代わりにvector::at()を使用する必要があります。
- 1. 鉱山のウェブクローラで
- 2. SFINAEコンパイラは、鉱山の
- 3. 鉱山の地雷数Java
- 4. マージ後のインタラクティブリベース/その他インターリーブ鉱山
- 5. 鉱山以外のフィードにCSSを追加するには
- 6. 2008 SQL EXPRESSストアドプロシージャ - 鉱山が見つかりません
- 7. 鉱山.csvファイルがアップロードされていませんか?
- 8. django-admin makemessages =>すべてのdjangoパッケージを鉱山で翻訳する
- 9. キューのメモリを解放するには?鉱山は無料ではありません
- 10. 地雷鉱山のゲームは、スイッチのステートメントのみを使用しています...エラーが発生しました,,,,?
- 11. 鉱山フレーズ(3ワードまで)私は私の問題に簡単な解決策のために前に頼ま
- 12. 特定のアプリケーション(鉱山ではない)がユーザーに表示/非表示になったときの検出
- 13. Firefoxで鉱山のページをキャッシュするのを止めるにはどうすればいいですか?
- 14. WPF:私は私のプロジェクトにアナログクリックを追加しようとしている鉱山
- 15. PHPは、クラス関数とプロパティが同じ名前を共有できるようにしますか?鉱山の
- 16. Javaの掃除機のゲームの問題。ゲーム開始時に鉱山を隠している?
- 17. 1つのChromeインスタンス(鉱山)のページで不思議にFacebookのログインが失敗する
- 18. NSSharingServiceは山のライオンに山のライオンにウィンドウ
- 19. は鋸山
- 20. ベクター<string>またはベクター<ベクター<char>>?
- 21. フォームPOSTメソッドの戻りHTTPエラー405.0方法は、鉱山からのページには、次のようにformタグを持っている
- 22. ベクター
- 23. 鋸山
- 24. 鋸山
- 25. 鋸山
- 26. 鋸山
- 27. OpenMPの共有ベクター
- 28. Hpricot /鋸山
- 29. 杉山アンドロイド
- 30. HTMLの右山かっこ
テンプレートの問題*はコンパイル時に検出されます。しかし、テンプレートの問題はありません。検出するものは何ですか? –
さらに、コンパイラは、ベクトルが空に初期化され、ベクトルが何であり、v [0]が何を返すべきであるかをどのように知っていますか? –
これは_必ずしもエラーではないので、コンパイラはおそらくこのようなケースを簡単に検出できたとしても、不平を言ってはいけません。たとえば、 'std :: map'では、存在しないインデックスで' operator [] 'を呼び出すことはまったく正当です。これは、新しくデフォルトで構築された要素への参照を返します。コンパイラは間違った使い方について積極的に知ることができないと仮定してはなりません。 – Damon