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