Co to za szalona składnia C ++ 11 ==> struct: bar {} foo {} ;?


Odpowiedzi:


262

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ę instancena 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.


11
Wiem, że należy unikać negatywnych komentarzy na temat języka programowania, a może jest to trochę poza tematem. Ale nie rozumiem, dlaczego C ++ 0x staje się językiem jeszcze bardziej złożonym niż C ++. Kto tego chce? Jakie są zalety języka programowania, który staje się coraz bardziej tajemniczy? Ta deklaracja jest jeszcze jednym przykładem tego IMHO. Używam C ++ od wielu lat i nadal mam trudności ze opanowaniem tego języka.
Giorgio

26
@Giorgio: Dlaczego to jest problem? Co dokładnie cię przeraża? Opisana konstrukcja jest przypadkiem marginalnym, na który pozwala język i naturalnie wynika z jego podstawowych koncepcji, nie ma w tym nic złego. Ma również bardzo ograniczoną użyteczność. Nigdy nie będziesz musiał go używać. Jest to jednak logiczne składniowo i nie koliduje ani nie koliduje z niczym. Dlaczego więc miałby to być argument przeciwko językowi, zwłaszcza takiemu , który jest wyjątkowo dobrze zaprojektowany?
Kerrek SB

13
@Giorgio - wspaniałą częścią jest to, że sytuacja jest dokładnie odwrotna; c ++ 0x dodaje wiele tak długo oczekiwanych, potężnych udogodnień, nie będąc tajemniczym ani zbyt brzydkim; chcesz tajemnicze? - sprawdź Perla. Ten przykład nigdzie nie zbliża się do tytułu tajemniczego.
Gene Bushuyev

18
@Kerrek SB Myślę, że C ++ (a teraz C ++ 0x) ma po prostu zbyt wiele różnych koncepcji, a nauka składni i semantyki jest trudna. Każdy programista (ja jestem jednym z nich) w końcu używa podzbioru języka, ponieważ istnieje zbyt wiele różnych sposobów zrobienia tego samego. Nie sądzę, aby C ++ był dobrze zaprojektowany. Istnieje wiele funkcji ad-hoc i brakuje pewnych fundamentalnych rzeczy, takich jak niezawodny mechanizm (import / eksport) modułu (nadal używa starego #include z C). Myślę, że wysiłek C ++ 0x powinien mieć na celu uczynienie C ++ mniejszym i łatwiejszym w użyciu, a nie większym.
Giorgio

31
@Giorgio: Szczerze mówiąc, każdy taki wysiłek musiałby polegać na przebudowie C ++ od podstaw, tj. Stworzeniu nowego języka . I że nie zostało zrobione ... wiele razy.
Wyścigi lekkości na orbicie

106

To określa:

  • anonimowa struktura,
  • który pochodzi publicznie z bar
  • która ( anonymously) nie definiuje nic innego, jak tylko to, z czego pochodzibar
  • i na koniec tworzona jest instancja o nazwie „foo”,
  • z pustą listą inicjalizującą

struct : bar {} foo {};
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.