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

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

struct : bar {} foo {};
13686 次浏览

首先,我们采用一个标准的抽象 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,并使用空白初始值设定项。

这意味着:

  • 一个匿名结构,
  • 它是从 bar公开派生出来的
  • 它(anonymously)只定义从 bar派生出来的东西
  • 最后创建一个名为“ foo”的实例,
  • 初始值设定项列表为空

struct : bar {} foo {};