Что это за сумасшедший синтаксис С++ 11 ==> struct: bar {} foo {};?

Что это может означать в С++ 11?

struct : bar {} foo {};

Ответ 1

Во-первых, мы возьмем абстрактную 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, поэтому мы можем потерять чистую виртуальную функцию. Также переименовав instance в foo, мы остаемся с:

struct {} foo;

Как закрыть.


Теперь, что, если этот анонимный UDT должен был произойти из какой-то базы?

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

Наконец, С++ 11 вводит расширенные инициализаторы, так что мы можем запутать такие вещи:

int x{0};

И это:

int x{};

И, наконец, это:

struct : bar {} foo {};

Это неназванная структура, получаемая из бара, созданная как foo с пустым инициализатором.

Ответ 2

Это определяет:

  • анонимная структура,
  • который выводится публично из bar
  • который (anonymously) не определяет ничего, кроме того, что он получил от bar
  • и, наконец, создается экземпляр с именем "foo",
  • с пустым списком инициализаторов

struct : bar {} foo {};