なぜコンパイラは共用体で std::string を許可しないのですか?
C を使用する場合、多くの場合、データ構造を使用する必要があります。さまざまな種類のデータを保存できます。このような構造の 1 つは共用体で、複数の変数を同じメモリ位置に割り当てます。ただし、共用体のメンバーに対する制限に関してよくある質問が生じます。
重要な制限の 1 つは、自明ではないコピー コンストラクターを持つクラスを共用体に含めることができないことです。これには、std::string のようなクラスが含まれます。その理由を理解するには、次のシナリオを考えてください。
union U { std::string x; std::vector<int> y; }; U u; // <--
従来、構造体で u.x または u.y を初期化すると、それらがデフォルト値に設定されていました。ただし、共用体ではすべてのメンバーが同じアドレスを共有するため、データを上書きせずに両方のメンバーに値を割り当てることはできません。どちらのメンバーも初期化されていない場合、それらを使用すると未定義の動作が発生します。
C 98 では、自明でないコンストラクターを持つクラスが共用体のメンバーになることを禁止することで、この問題に対処しました。具体的には、§9.5/1 で次のように述べられています。
「非自明なコンストラクター (12.1)、非自明なコピー コンストラクター (12.8)、非自明なデストラクター (12.4) を持つクラスのオブジェクト」 、または非自明なコピー代入演算子 (13.5.3、12.8) は共用体のメンバーになることはできず、そのような配列も共用体のメンバーになることはできません。
この制限により、共用体内のデータ操作を効果的に処理できることが保証されます。
C 0x では、このルールがある程度緩和され (§9.5/2)、最大 1 つの非静的オブジェクトが許可されます。中括弧または等号初期化子を持つデータ メンバー。ただし、エラーのないコピー コンストラクターとユニオンのデストラクターを作成することは依然として複雑です。このため、タグ付きユニオンや、boost::variant や boost::any などのサードパーティ ライブラリは、異種データを操作するための代替ソリューションを提供します。
以上がC Union で `std::string` を使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。