問題タブ [one-definition-rule]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
2105 参照

c++ - constexpr と ODR

widget.hpp以下の内容のヘッダー ファイルがあるとします。

...そして、 のみを含む 2 つのソース ファイルから生成された 2 つの翻訳単位がありwidget.hppますfoo

foo内部リンケージがありますが、定数式でもあります。以下に引用する C++11 標準の 3.2.6 を読んだところ、要件 2 が静的データ メンバーのみを参照していない場合、これは整形式です。


3.2.6 要件 #2:

D の各定義では、対応する名前は、3.4 に従って検索され、D の定義内で定義されたエンティティを参照するか、またはオーバーロードの解決 (13.3) および部分的なテンプレートの特殊化の一致 (14.8) の後に同じエンティティを参照する必要があります。 .3)ただし、オブジェクトが D のすべての定義で同じリテラル型を持ち、オブジェクトが定数式 (5.19) で初期化されている場合、名前は内部リンケージまたはリンケージなしの非揮発性 const オブジェクトを参照できます。オブジェクトは ODR 使用されておらず、オブジェクトは D のすべての定義で同じ値を持っています

0 投票する
2 に答える
3804 参照

c++ - ヘッダー ファイルで定義されたインライン化されていない仮想関数

One Definition Rule は次のように述べています。
プログラム全体で、オブジェクトまたは非インライン関数は複数の定義を持つことはできません。(ウィキペディアより)

メンバー関数がヘッダー ファイルで定義されている場合、それは暗黙的にインライン化され、ODR で問題ないことはわかっています。

しかし、仮想関数はどうでしょうか? 仮想関数が多態的に呼び出される場合、インライン化できないことがわかっています。そのような仮想関数がヘッダー ファイルで定義されている場合、ODR に違反しますか?

例えば:

私は興味があります:

vfunc(および dtor) は foo.cpp と main.cpp の両方でポリモーフィックに (インライン化されずに) 呼び出されます。つまり、プログラム全体で 2 回定義されているため、ODR に違反していますね。どのようにコンパイルしますか(リンク)?

私はちょうどそれを見ました:

複数の定義

場合によっては、型またはテンプレートの定義が複数存在することがあります。複数のヘッダー ファイルとソース ファイルで構成されるプログラムには、通常、1 つの型の定義が複数ありますが、翻訳単位ごとに複数の定義はありません。プログラムに型の複数の定義が含まれている場合、各定義は同等でなければなりません (これもウィキペディアから取得)。

とは何certain casesですか? 上記のケースはその1つでしょうか?

0 投票する
1 に答える
148 参照

c++ - デフォルトのテンプレート引数は 1 つの定義ルールに入りますか?

複数の翻訳単位で、既定のテンプレート引数は異なるが同じ定義を持つ同じテンプレートの宣言を行うことはできますか? たとえば、b.cppとの翻訳単位c.cppが一緒にリンクされている場合、次のコードは ODR に違反しますか?

0 投票する
3 に答える
3601 参照

c++ - グローバル std::string と 1 つの定義規則

次の定義を含むヘッダー ファイルがあります。

現在、このファイルを 2 つの異なる翻訳単位に含めて、ソース コードをコンパイルしています。すべてが機能しますが、なぜですか?これは壊れると予想されone definition ruleます。

さらに興味深いことに、タイプを変更しています

これが予想されるエラーです

intcharshortおよびその他の整数型のstd::string と同じように機能します。これは何ですか?