这可能在C ++ 11中意味着什么?
struct : bar {} foo {};
答案 0 :(得分:260)
首先,我们将采用沼泽标准的抽象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
最后,C ++ 11引入了扩展初始化,这样我们就可以做到这样的混乱:
int x{0};
而且:
int x{};
最后,这个:
struct : bar {} foo {};
这是一个源自bar的未命名结构,实例化为foo,带有空白的初始值设定项。
答案 1 :(得分:104)
这定义:
bar
anonymously
)除了从bar
struct : bar {} foo {};