为什么C ++ 11不支持匿名结构,而C11呢?
C11支持匿名结构,如下所示:
struct Foo { struct { size_t x, y; }; }; struct Foo f; fx = 17; fy = 42;
基本上,这样的struct
的成员被视为如果它们是封闭的struct
或union
成员(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? 你甚至可以在结构之外定义SomeFunc
? SomeFunc
的名称不能是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;
这帮助我解决了类似的问题。