45

C11 は、次のような無名構造をサポートしています。

struct Foo
{
    struct
    {
        size_t x, y;
    };
};
struct Foo f;
f.x = 17;
f.y = 42;

基本的に、そのような a のメンバーは、囲んでいるorstructのメンバーであるかのように扱われます(囲んでいる構造自体が無名の場合、再帰的に)。structunion

C++11 が無名構造を含まない理由は何ですか? struct確かに、それらはめったに役に立たないだけです(ほとんどの場合、共用体の中で、 の識別子の入力をなくすためです)。しかし、それらは仕様 (および多くのコンパイラーによって既に実装されているもの) への明らかな追加であるように思われるため、少なくとも C11 標準との互換性を維持するために、それらは確かに議論されたに違いありません。では、なぜ追加されなかったのでしょうか。

4

2 に答える 2

45

C++ と C の進化に伴い、C++ と C の間の互換性を維持するための努力はほとんど行われていません。可変長スタック配列は 1999 年以来 C にありましたが、C++11 には含まれていませんでした。一般に、互いに矛盾するものを導入することはありませんが、C++ 委員会は、C++11 が C89 以降のバージョンの C と互換性があることを確認するために、後ろ向きに曲がっているわけではありません。

structさらに、 a は aにすぎないため、この機能は C++ では非常に複雑になりますclass。そして、匿名の構造体/クラスには、通常の構造体/クラスのすべての機能が必要ですよね? そうでなければ、それを持っている意味は何ですか?

nameless を構築するとはどういう意味structですか? コンストラクターをどのように定義しますか? 次のような簡単なもの:

struct Foo
{
    struct
    {
        size_t &x;
    };
};

struct内部にはコンストラクターがないため、単純に不可能です。そして、それを特定する方法はありません。Astructは、その中に別のメンバーを構築することはできませんstruct

このようなもののために:

struct Foo
{
    size_t outer;
    struct
    {
        void SomeFunc();
        size_t x;
    };
};

どのthisポインタがSomeFunc得られますか? this名前のないタイプと名前のないタイプのタイプは何ですか? SomeFunc構造体の外でどのように定義しますか? は内部スコープにあるため、の名前を にすることはSomeFuncできません。Foo::SomeFuncSomeFunc

C++ で処理するには複雑すぎます。そして、その複雑さを追加することを気にするほど価値がないことは確かです.

于 2011-12-24T03:39:57.090 に答える