1. ホーム
  2. c++

[解決済み] このおかしなC++11の構文==> struct : bar {} foo {}; は何ですか?

2022-04-23 13:32:52

質問

C++11ではどのような意味があるのでしょうか?

struct : bar {} foo {};

解決方法は?

まず、標準的な抽象的UDT(User-Defined Type:ユーザー定義型)を取り上げます。

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についての証明はもう必要ないので、純粋仮想関数をなくしても大丈夫です。また instance から foo が残っています。

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としてインスタンス化され、イニシャライザは空白です。