[英]Why does C++11 not support anonymous structs, while C11 does?
C11支持匿名结构,如下所示:
struct Foo
{
struct
{
size_t x, y;
};
};
struct Foo f;
f.x = 17;
f.y = 42;
基本上,这样的struct
的成员被视为它们是封闭struct
或union
成员(如果封闭结构本身是匿名的,则递归地)。
C ++ 11的理由是什么,还包括匿名结构? 当然,它们只是非常有用(主要是在联合内部,以消除struct
的标识符的类型)。 但它们似乎是对规范的明显补充(以及已经由许多编译器实现的规范),它们肯定必须经过讨论,至少是为了保持与C11标准的兼容性。 那他们为什么不加?
随着两种语言的发展,在C ++和C之间保持兼容性的努力很少。 请注意,自1999年以来,可变长度堆栈数组已在C中,但未包含在C ++ 11中。 虽然它们通常不会引入相互矛盾的东西,但C ++委员会并没有完全反过来确保C ++ 11与C89之外的C版本兼容。
此外,这个特性在C ++中会非常复杂,因为struct
只不过是一个class
。 一个匿名的struct / class应该具有常规struct / class的所有功能,是吗? 否则,有什么意义呢?
构建无名struct
意味着什么? 你会如何定义构造函数? 简单的事情:
struct Foo
{
struct
{
size_t &x;
};
};
根本不可能,因为内部struct
没有构造函数。 并且没有办法指定一个。 struct
不能构造其中的另一个struct
的成员。
对于这样的事情:
struct Foo
{
size_t outer;
struct
{
void SomeFunc();
size_t x;
};
};
什么this
指针不SomeFunc
得到什么? 什么会的类型this
是无名和无名类型? 你怎么会在结构之外定义SomeFunc
? SomeFunc
的名称不能是Foo::SomeFunc
,因为SomeFunc
位于内部范围内。
这对C ++来说太复杂了。 当然不值得为添加复杂性而烦恼。
扮演魔鬼的拥护者 - 经常使用类和结构声明来包装特定于类的类型声明。
typedef struct {
} name;
因此应该是允许的。
因此
struct {
}
应该也是。
但是,如果我们将此视为类内部命名空间中的声明,则无法访问结构内部。
因为C中的struct!= namespace,所以C可以构成通过周围结构访问匿名结构的规则。
对于C ++来说,允许这种情况需要特殊情况,这会使名称解析变得复杂。
当然,扮演魔鬼的魔鬼的拥护者--C实际上是这样做的。 它为名称解析添加了额外的级别 - 如果您在stuct中找不到该名称,请检查该结构的匿名成员。 这有点神奇,在某种程度上我可以看到C ++委员会成员发现很烦人。
它还提出了一些问题 - 如果可以通过其父类访问匿名结构,那么名称空间中的匿名结构如何。
当然,如果你真的想知道,只要问Stroustrup - 他会回复电子邮件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.