为什么C ++ 11不支持匿名结构,而C11呢?

C11支持匿名结构,如下所示:

struct Foo { struct { size_t x, y; }; }; struct Foo f; fx = 17; fy = 42; 

基本上,这样的struct的成员被视为如果它们是封闭的structunion成员(recursion,如果封闭的结构本身是匿名的)。

C ++ 11的基本原理是不包括匿名结构? 它们通常是非常有用的(大多数在工会内部,为了消除struct的标识符的键入)。 但是,对于规范(以及许多编译器已经实现的规范)来说,它们似乎是一个明显的补充,它们肯定已经被讨论过了,至less要保持与C11标准的兼容性。 那么他们为什么不添加?

随着两种语言的发展,C ++和C之间的兼容性已经很less了。 请注意,可变长度堆栈数组自1999年以来一直在C中,但未包含在C ++ 11中。 虽然他们通常不会引入互相矛盾的事情,但是C ++委员会并没有完全退缩,以确保C ++ 11与C89之外的C版本兼容。

而且,这个特性在C ++中会相当复杂,因为一个struct只不过是一个class而已。 而且一个匿名的struct / class应该具有常规struct / class的所有function,是的? 否则,有什么意义呢?

什么意思构build一个无名的struct ? 你将如何定义构造函数? 一些简单的事情:

 struct Foo { struct { size_t &x; }; }; 

是不可能的,因为内部struct没有构造函数。 而且没有办法指定一个。 一个struct不能构造其中另一个struct的成员。

对于这样的事情:

 struct Foo { size_t outer; struct { void SomeFunc(); size_t x; }; }; 

SomeFunc得到什么指针? 这是什么types的,无名和无名的types? 你甚至可以在结构之外定义SomeFuncSomeFunc的名称不能是Foo::SomeFunc ,因为SomeFunc位于内部范围内。

对于C ++来说这太复杂了。 当然不足以打扰增加复杂性。

玩恶魔的倡导者 – 类和结构声明经常用来包装类特定的types声明。

 typedef struct { } name; 

因此应该是可以允许的。

因此

 struct { } 

应该也是。

但是,如果我们把它看作是类内部命名空间中的一个声明,那么将无法访问结构的内部。

因为C中的struct!=命名空间,C可以构造规则,如通过周围的结构访问一个匿名结构。

对于C ++来说,这将需要特殊情况下的这种情况,这会使命名parsing复杂化。

当然,扮演恶魔的魔鬼的拥护者 – C实际上是这样做的。 它为命名parsing添加了额外的级别 – 如果在stuct中找不到名称,请检查struct的匿名成员。 这是一个有点神奇的方式,我可以看到C ++委员会成员觉得讨厌。

它也引发了一些问题 – 如果一个匿名结构可以通过它的父类来访问,那么匿名结构又如何呢?

当然,如果你真的想知道,只要问Stroustrup – 他回复电子邮件。

它认为这在C ++ 11中起作用

 struct A { int someVariable; }; struct B : public A { int someOtherVariable; }; 

使用它作为:

 B structB; structB.someVariable = 5; structB.someOtherVariable = 6; 

这帮助我解决了类似的问题。