什么是这个疯狂的C ++ 11语法==> struct:bar {} foo {} ;?

时间:2011-08-15 16:36:36

标签: c++ c++11

这可能在C ++ 11中意味着什么?

struct : bar {} foo {};

2 个答案:

答案 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
  • 派生的内容之外,没有定义任何其他内容
  • 最后,创建了一个名为“foo”的实例,
  • 使用空的初始化列表

struct : bar {} foo {};