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

时间:2011-12-24 03:20:53

标签: c++ c c++11 anonymous-types c11

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

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

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

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

2 个答案:

答案 0 :(得分:43)

随着两种语言的发展,在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的类型是什么,无名和未命名类型?你怎么在结构之外定义SomeFuncSomeFunc的名称不能为Foo::SomeFunc,因为SomeFunc位于内部范围内。

对于C ++来说,处理它太复杂了。当然不值得为此添加复杂性而烦恼。

答案 1 :(得分:3)

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

typedef struct {

} name;
因此应该是允许的。

因此

struct {

} 

应该也是。

但是,如果我们将此视为类内部命名空间中的声明,则无法访问结构内部。

因为C语言中的struct!=名称空间,C可以构成通过周围结构访问匿名结构的规则。

对于允许这样做的C ++,这种情况需要特殊情况,这会使名称解析复杂化。

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

它也引发了一些问题 - 如果可以通过其父类访问匿名结构,那么名称空间中的匿名结构会怎么样。

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