繁体   English   中英

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

[英]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的成员被视为它们是封闭structunion成员(如果封闭结构本身是匿名的,则递归地)。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM