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


168

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

struct : bar {} foo {};

有趣的是,您发现它对某些事情有用吗?我想这是生成强类型(标记类型)单个实例的技巧。
alfC

@alfC:不是特别有用,不是
赛于

Answers:


262

首先,我们将采用沼泽标准的抽象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的证明,因此我们可能会丢失纯虚函数。同样重命名instancefoo,我们还有:

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。


11
我知道应该避免对编程语言发表负面评论,这可能与本文无关。但是我不明白为什么C ++ 0x变得比C ++更复杂。谁想要那个?变得越来越神秘的编程语言有什么优势?该声明是恕我直言,这是另一个例子。我已经使用C ++多年了,但仍然很难掌握这种语言。
乔治

26
@乔治:为什么这是个问题?到底是什么吓到了你?所描述的构造是该语言允许的边缘情况,并且自然遵循其核心概念,因此没有任何问题。它的用途也非常有限。您将永远不必使用它。但是,它在语法上是逻辑上的,不会与任何东西冲突或冲突。那么,为什么这会成为反对一种语言的争论,尤其是一种设计精良的语言?
Kerrek SB

13
@Giorgio-妙处在于情况正好相反;c ++ 0x正在添加许多期待已久的强大功能,而又不会变得晦涩难懂。你想神秘吗?-查看Perl。这里的这个例子几乎无处接近隐秘的标题。
Gene Bushuyev 2011年

18
@Kerrek SB我认为C ++(以及现在的C ++ 0x)具有太多不同的概念,学习语法和语义非常困难。每个程序员(我是其中的一个)最终都使用该语言的一个子集,因为做同一件事的方法太多了。我认为C ++设计得不好。有许多临时功能,缺少某些基本功能,例如健壮的模块(导入/导出)机制(仍使用C中的旧#include)。我认为C ++ 0x的工作应旨在使C ++更小,更易于使用,而不是更大。
乔治

31
@Giorgio:说实话,任何这样的努力都必须从头开始重建C ++,即创建一种新语言。这已经做过......很多次。
Lightness Races in Orbit

106

定义:

  • 一个匿名结构
  • 公开地来自 bar
  • 其中(anonymously)仅定义了其他内容bar
  • 最后,创建了一个名为“ foo”的实例,
  • 空的初始化列表

struct : bar {} foo {};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.