Co to może oznaczać w C ++ 11?
struct : bar {} foo {};
Co to może oznaczać w C ++ 11?
struct : bar {} foo {};
Odpowiedzi:
Najpierw weźmiemy abstrakcyjne UDT standardu bog (typ zdefiniowany przez użytkownika):
struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'
Przypomnijmy też, że możemy utworzyć instancję UDT w tym samym czasie, w którym go definiujemy:
struct foo { foo() { cout << "!"; } }; // just a definition
struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"
Połączmy przykłady i przypomnijmy, że możemy zdefiniować UDT, który nie ma nazwy :
struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'
Nie potrzebujemy już dowodu o anonimowym UDT, więc możemy stracić czystą funkcję wirtualną. Zmieniając również nazwę instance
na foo
, zostaje nam:
struct {} foo;
Zbliżać się.
A co by było, gdyby ten anonimowy UDT wywodził się z jakiejś podstawy?
struct bar {}; // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof
Wreszcie, C ++ 11 wprowadza rozszerzone inicjatory , dzięki którym możemy robić takie mylące rzeczy:
int x{0};
I to:
int x{};
I na koniec to:
struct : bar {} foo {};
Jest to nienazwana struktura pochodząca z baru, utworzona jako foo z pustym inicjatorem.