このクレイジーなC ++ 11構文は何ですか==> struct:bar {} foo {} ;?


168

これはおそらくC ++ 11で何を意味するのでしょうか?

struct : bar {} foo {};

興味深いですが、何かに役立つと思いましたか?強い型付け(タグ付きの型)の単一インスタンスを生成するのはトリックだと思います。
alfC 2018年

@alfC:特に役に立たない、いいえ
オービットの

回答:


262

最初に、沼地標準の抽象UDT(ユーザー定義型)を使用します。

struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'

また、UDTを定義すると同時にインスタンス化できることも思い出してください。

struct foo { foo() { cout << "!"; } };          // just a definition

struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"

例を組み合わせて、名前のない UDTを定義できることを思い出してください。

struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'

匿名のUDTに関する証明はもう必要ないため、純粋な仮想関数を失う可能性があります。また、名前instancefooに変更すると、次のようになります。

struct {} foo;

近づいて。


では、この匿名UDTが何らかのベースから派生したとしたらどうでしょうか。

struct bar {};       // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof

最後に、C ++ 11は拡張イニシャライザを導入しているため、次のような混乱を招く可能性があります。

int x{0};

この:

int x{};

そして最後に、これ:

struct : bar {} foo {};

これは、barから派生した名前のない構造体で、空の初期化子を使用してfooとしてインスタンス化されます。


11
プログラミング言語についての否定的なコメントは避けるべきだと私は知っています。多分それはここでは少し外れたトピックです。しかし、C ++ 0xがC ++よりもさらに複雑な言語になっている理由がわかりません。誰がそれを望んでいますか?ますます不可解になっているプログラミング言語の利点は何ですか?この宣言は、私見のさらに別の例です。私は長年C ++を使用していますが、この言語を習得するのはまだ困難です。
ジョルジョ

26
@ジョルジオ:なぜこれが問題なのですか?何があなたを怖がらせていますか?記述された構文は、言語によって許可されている周辺のケースであり、そのコアコンセプトから自然に続くものであり、何も問題はありません。また、非常に限定されたユーティリティです。あなたはそれを使用する必要はありません。ただし、構文的に論理的であり、衝突したり競合したりすることはありません。それで、なぜこれが言語、特に例外的にうまく設計されたものに対する反対論になるのでしょうか?
Kerrek SB、2011

13
@ジョルジオ-素晴らしい部分は、状況が正反対であることです。c ++ 0xは、謎めいたり、見苦しくなったりすることなく、待望の多くの強力な機能を追加しています。あなたは不可解にしたいですか?-Perlを調べてください。この例は、暗号のタイトルにほとんど近づいていません。
Gene Bushuyev、2011

18
@Kerrek SB C ++(および現在のC ++ 0x)には、さまざまな概念が多すぎるため、構文とセマンティクスの学習は難しいと思います。同じことを行う方法が多すぎるため、各プログラマー(私はそのうちの1人です)は最終的に言語のサブセットを使用します。C ++はうまく設計されていないと思います。多くのアドホック機能があり、堅牢なモジュール(インポート/エクスポート)メカニズムなどの特定の基本的なものが欠落しています(まだCの古い#includeを使用しています)。C ++ 0xの取り組みは、C ++を大きくするのではなく、小さくして使いやすくすることを目指していると思います。
ジョルジョ

31
@Giorgio:正直に言うと、そのような努力はC ++をゼロから再構築する、つまり新しい言語を作成することに取り組む必要があります。そして、それ何度も行われました...
オービットでの軽さのレース

106

これは以下を定義します:

  • 匿名の構造体、
  • 公に由来している bar
  • which(anonymously)は、何から派生したかを定義するだけですbar
  • そして最後に、「foo」というインスタンスが作成されます。
  • 空のイニシャライザリスト

struct : bar {} foo {};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.