Que cela peut-être signifierait en C ++11 ?
Réponses
Trop de publicités?Tout d'abord, nous allons jeter un bog-standard abstrait défini par l'utilisateur (Type Défini par l'Utilisateur):
struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'
Rappelons aussi que nous pouvons instancier l'UDT dans le même temps que nous la définissons:
struct foo { foo() { cout << "!"; } }; // just a definition
struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"
Nous allons combiner les exemples, et de rappeler que l'on peut définir un type qui a pas de nom:
struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'
Nous n'avons pas besoin de la preuve au sujet de l'anonyme de type défini par l'utilisateur, de sorte que nous pouvons perdre la fonction virtuelle pure. Aussi renommer instance
de foo
, nous obtenons:
struct {} foo;
Proche.
Maintenant, si cette anonyme UDT étaient de dériver de base?
struct bar {}; // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof
Enfin, C++11 introduit étendu initialisers, ce qui nous permet de faire la confusion choses comme ceci:
int x{0};
Et ceci:
int x{};
Et, enfin, ceci:
struct : bar {} foo {};
C'est un sans nom struct découlant de bar, instancié comme foo avec un vide d'initialiseur.