What could this possibly mean in C++11?
struct : bar {} foo {};
What could this possibly mean in C++11?
struct : bar {} foo {};
First, we'll take a bog-standard abstract UDT (User-Defined Type):
struct foo { virtual void f() = 0; }; // normal abstract type foo obj; // error: cannot declare variable 'obj' to be of abstract type 'foo'
Let's also recall that we can instantiate the UDT at the same time that we define it:
struct foo { foo() { cout
Let's combine the examples, and recall that we can define a UDT that has no name:
struct { virtual void f() = 0; } instance; // unnamed abstract type // error: cannot declare variable 'instance' to be of abstract type ''
We don't need the proof about the anonymous UDT any more, so we can lose the pure virtual function. Also renaming instance
to foo
, we're left with:
struct {} foo;
Getting close.
Now, what if this anonymous UDT were to derive from some base?
struct bar {}; // base UDT struct : bar {} foo; // anonymous derived UDT, and instance thereof
Finally, C++11 introduces extended initialisers, such that we can do confusing things like this:
int x{0};
And this:
int x{};
And, finally, this:
struct : bar {} foo {};
This is an unnamed struct deriving from bar, instantiated as foo with a blank initializer.
This defines:
bar
anonymously
) defines nothing else but what it derived from bar
struct : bar {} foo {};