Что это за сумасшедший синтаксис С++ 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