問題タブ [standard-layout]
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++ では完全に合法だと思います。http://en.cppreference.com/w/cpp/language/union#Explanation言います:
2 つの共用体メンバーが標準レイアウト型である場合、任意のコンパイラで共通のサブシーケンスを調べることが明確に定義されています
したがって、gccでこれを行うことができます:
Visual Studio 2008 でこれを試すと、次のエラーが表示されます。
エラー C2620: のメンバー
Bar::fBar
に、union Bar
ユーザー定義のコンストラクターまたは重要な既定のコンストラクターがあります
エラー C2620は次のように述べています。
ユニオン メンバーは、既定のコンストラクターを持つことはできません。
何が起きてる?これは C++ の要件だったのですか? Standard Layout が唯一の要件だと思いましたか? これに対する回避策はありますか?
c++ - Union メンバーのデストラクタが呼び出されているか
C++11 では、標準のレイアウト タイプを使用できるようになりましたunion
。共用体のメンバーにはユーザー定義のコンストラクターがあります
私の質問は次のとおりunion
です。範囲外になったときにカスタムデストラクタが呼び出されることは保証されていますか?
私の理解では、切り替え時に手動で破棄および構築する必要があります: http://en.cppreference.com/w/cpp/language/union#Explanation
しかし、次のような例はどうでしょうか。
範囲外になった場合、のデストラクタs
を呼び出していないため、ヒープに割り当てられた文字列のメモリ リークが発生したのでしょうか。string
c++ - 「ブラック ボックス」タイプの標準レイアウト保証の目的は何ですか?
C++ 標準では、mutex、atomics、または conditinal_variable が標準レイアウト タイプであることを指定しています。
この仕様の利点は何ですか? ユーザーはこのプロパティをどのように活用できますか?
一般に、実装の詳細を知らなくても型が標準レイアウトであることを知っている場合、何が得られるでしょうか?
c++11 - c++11 での POD 型と継承: 継承と拡張ができないのに、POD 型のままでいられるのはなぜですか
これは例で説明するのが一番だと思います:
出力:
C
standard_layout として認定されないのはなぜですか。予想通り、 と同じメモリ レイアウトを持っていますB
。何が異なる可能性がありますか?