45

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

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

基本上,此类 a 的成员struct被视为封闭的成员structunion(递归地,如果封闭结构本身是匿名的)。

C++11 不包括匿名结构的理由是什么?当然,它们只是非常有用(主要是在联合内部,以消除为 输入标识符struct)。但它们似乎是对规范的一个足够明显的补充(并且已经由许多编译器实现),肯定必须讨论它们,至少要保持与 C11 标准的兼容性。那么为什么不添加它们呢?

4

2 回答 2

45

随着 C++ 和 C 两种语言的发展,几乎没有做出任何努力来保持 C++ 和 C 之间的兼容性。请注意,可变长度堆栈数组自 1999 年以来一直在 C 中,但未包含在 C++11 中。虽然他们通常不会引入相互矛盾的东西,但 C++ 委员会并没有完全向后弯曲以确保 C++11 与 C89 之后的 C 版本兼容。

此外,这个特性在 C++ 中会非常复杂,因为 astruct只不过是 a class。匿名结构/类应该具有常规结构/类的所有功能,是吗?否则,拥有它有什么意义?

构造一个无名的意味着什么struct?你会如何定义构造函数?像这样简单的东西:

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

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

对于这样的事情:

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

得到什么this指针SomeFuncthis无名无名的类型会是什么类型?你甚至会如何SomeFunc在结构之外定义?SomeFunccan't be的名称Foo::SomeFunc,因为SomeFunc存在于内部范围内。

C++ 处理起来太复杂了。而且肯定不值得为增加这种复杂性而烦恼。

于 2011-12-24T03:39:57.090 回答
4

扮演魔鬼的拥护者 - 类和结构声明通常用于包装特定于类的类型声明。

typedef struct {

} name;

因此应该是允许的。

所以

struct {

} 

应该也是。

然而,如果我们认为这只是一个类的内部命名空间中的声明,就没有办法访问结构的内部。

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

为了让 C++ 允许这样做,它需要对这种情况进行特殊处理,这会使名称解析复杂化。

当然,扮演魔鬼的魔鬼代言人-C实际上是这样做的。它为名称解析增加了一个额外的级别 - 如果您在结构中找不到名称,请检查结构的匿名成员。这有点神奇,在某种程度上,我可以看到 C++ 委员会成员觉得很烦人。

它还提出了一些问题——如果可以通过其父类访问匿名结构,那么命名空间中的匿名结构呢?

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

于 2013-11-12T14:53:12.873 回答