問題タブ [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.
c++ - 現在のC++0x標準ドラフトのこの段落を誰かが説明できますか?
ISON3242§3.2の2番目のポイントからこのステートメントを誰かが説明できますか
クラスの非配置割り当てまたは割り当て解除関数は、そのクラスのコンストラクターの定義によってodr-useされます。クラスの非配置割り当て解除関数は、そのクラスのデストラクタの定義によって、または仮想デストラクタ(12.4)の定義ポイントでのルックアップによって選択されることによってodrで使用されます。26クラスのコピー割り当て関数はodr-12.8で指定されているように、別のクラスに対して暗黙的に定義されたコピー割り当て関数によって使用されます。クラスのムーブ代入関数は、12.8で指定されているように、別のクラスの暗黙的に定義されたムーブ代入関数によってodrで使用されます。
ISO規格2003によると:
クラスのコピー代入関数は、12.8で指定されているように、別のクラスの暗黙的に定義されたコピー代入関数によって使用されます。
これらのステートメントの実際の違いは何ですか?
誰かが例/プログラムの観点から上記の追加されたポイントを説明します...?
コンストラクターの移動/割り当て関数の移動->新機能が追加されたことを知っています。
誰かが例/プログラムの助けを借りてこれを説明できますか?
お願いします.............
お答えください
c++ - Can anyone explain this paragraph of the current C++0x standard draft?
Can anyone explain this statement from ISO N3242 §3.2, 4th point
The added part of n3242 when compare to ISO Standard 2003 :
4
Exactly one definition of a class is required in a translation unit if the class is used in a way that requires theclass type to be complete.A class type
T
must be complete if:
- a non-static class data member of type
T
is declared (9.2), orT
is used as the object type or array element type in a new-expression- the type
T
is the subject of an alignof expression (5.3.6), or- an exception-declaration has type
T
, reference toT
, or pointer toT
Can anyone explain this paragraph of the current C++0x standard draft?
What is the actual meaning of adding this in these statement?
Can any one explain this with the help of an example/program?
c++ - これは C++ で合法的に行うことができますか?
注:次のコードは不正ですが、準拠するコンパイラはそれを拒否する必要はありません(拒否しないものもあります)。
私が使用しているライブラリには、のテンプレート関数宣言とinFoo
のテンプレート関数定義があります。Bar
foobar.h
意図は、他のコードが次のように使用できるようにすることです。
質問: この作業を合法的に行う方法はありますか?
問題は (私が物事を正しく理解している場合) コンパイルしても、これは技術的に違法であるということです:明示的な特殊化と の使用の両方が定義としてカウントされるため、 ODRBar<MyClass>
に違反します。使用例。
このパターンを使用してパラメーター化する理由Foo
は、スタイル ガイドに従う必要があるため、 の定義の前に何かが字句的に含まれていることを確認する唯一の方法は、Bar
によって含まれていることfoobar.h
です。しかし(説明する必要はないと思う理由で)それは初心者です。
c++ - name-lookup が別の宣言を検出したときの ODR 違反
以下を考えてみました。次の 2 つのファイルを検討してください。
A.cpp:
B.cpp:
このプログラムがなくvoid g(int) {}
ても 100% 有効です。ではvoid g(int) {}
、g(1)
A.cpp のテンプレート バージョンと B.cpp の非テンプレートに解決されます。
このプログラムは ODR に違反していますか? なんで?
c++ - const グローバル変数の複数定義が C++ では許可され、C では許可されないのはなぜですか?
1 つの定義規則により、C または C++ ではグローバル変数の複数定義は許可されません。ただし、C++ では、const グローバル変数を複数のコンパイル ユニットでエラーなしで定義できます。これは C と同じではありません。
Cでは許可されていないのに、C++では許可されているのはなぜですか? C++ では、C と比較して、const グローバルの使用法と動作が非 const グローバルとこのように異なるのはなぜですか? const に関して、C++ と C のカバーの下で何が起こっていますか?
たとえば、これは C++ では許可されていますが、C では間違っています。
これは C では問題ありませんが、C++ では問題があります。
c++ - c & c++ デフォルトのグローバル変数リンケージ、複数宣言 & 定義の問題
例えば:
code1.c / .cpp
code2.c / .cpp
コンパイルに行きます:
CとC++の間にグローバル変数リンケージの違いはありますか?
r - 3Dでの直交距離回帰
3Dのポイントパターンに最適な線を見つける方法を知っている人はいますか?
線までのすべての点のユークリッド距離の合計を最小化する、いわゆるODR(直交距離回帰)線に興味があります。
この問題の関数はrにありますか、そうでない場合は、これを自分で実装する方法を教えてください。
前もって感謝します!
c++ - 前方宣言テンプレート関数の必要性
最近、このサンプルコードを作成して、C++11可変個引数テンプレート関数の使用法を説明しました。
前方宣言する最初の2行をfoo
省略すると、int:123int:123
代わりにこれが出力されます。これは、特定の経験豊富で知識豊富なC++プログラマーを驚かせました。
彼は、2フェーズルックアップの第2フェーズまでボディがインスタンス化されないため、前方宣言は必要ないと確信していました。彼は、コンパイラ(gcc 4.6)にバグがあると考えています。
foo
2つは異なるベーステンプレート関数であり、ベーステンプレートの選択は最初のフェーズでロックインする必要があるため、コンパイラは正しいと思います。そうしないと、foo
すべてのバージョンが定義される前にインスタンス化することで、単一定義規則に違反する可能性があります。そしてその後も(リンカが冗長なテンプレート関数定義が同一で、交換可能で、破棄可能であるとどのように想定するかを検討してください)。
それで、誰が正しいのですか?
上記のリンクされたGOTWは、関数テンプレートが部分的に特殊化されない方法と理由をうまく説明していますが、可変個引数テンプレート関数の存在は混乱を助長しているようです-foo<int,Tail...>
部分的に特殊化されるべきfoo<Head,Tail...>
直感は、非少なくとも私にとっては、可変個引数関数。
c++ - std::piecewise_construct は ODR 違反を引き起こしませんか?
std::piecewise_construct
<utility> で定義されている は、宣言されているため、内部リンケージがありconstexpr
ます。std::piecewise_construct
ヘッダーで を使用すると、ODR に違反する可能性があるのではないかと思います。例えば:
a.hpp
翻訳単位 1
翻訳単位 2
TU 1のstd::piecewise_construct
inは、TU 2のf
in とは異なるオブジェクトを参照しています。ODR に違反していると思われます。f
f
N3290 (おそらく ISO/IEC 14882:2011 も) は、次のケースは 3.2/5 の ODR の例外であると述べています。
オブジェクトが D のすべての定義で同じリテラル型を持ち、オブジェクトが定数式 (5.19) で初期化され、値 (アドレスではない) がオブジェクトが使用され、オブジェクトは D のすべての定義で同じ値を持ちます。
f
ほとんどすべての要件を満たしていますが、「オブジェクトの値(アドレスではなく)が使用される」というのは曖昧に思えます。状態がないのは事実ですstd::piecewise_construct_t
が、 の区分コンストラクターの呼び出しには、引数が であるstd::pair
の暗黙的に宣言されたコピー コンストラクターの呼び出しが含まれます。アドレスは「使用済み」ですね。std::piecewise_construct_t
const std::piecewise_construct_t &
とても困惑しています。
参照: http://lists.boost.org/Archives/boost/2007/06/123353.php
c++ - 匿名の名前空間と単一定義規則
次のプログラムで単一定義規則に違反していますか?
と
と
そして最後に
foo()
上記では、それは匿名の名前空間で定義されていることに注意してください。したがって、各翻訳単位は独自のバージョンを取得することを期待しているので、ODRの違反はありませんm1.cpp
。m2.cpp
一方、bar()
は、たまたま2つの異なるを呼び出す単純な古いインライン関数foo
です。それで、それはODRに違反しますよね?
更新:
以前は、定義にマクロがあり、foo
それが返す値を変更し、マクロを含める前にそれぞれ異なる方法でマクロm1
を定義していました。(そして、その前の例では、期待した値以外の値で出力するバイナリを生成します。)しかし、実際には、このプログラムは、本体が同一であってもODRに違反します。m2
foo.hpp
g++
(i+j)
foo()