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

Jef*_*den 43 c c++ anonymous-types c++11 c11

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

struct Foo
{
    struct
    {
        size_t x, y;
    };
};
struct Foo f;
f.x = 17;
f.y = 42;
Run Code Online (Sandbox Code Playgroud)

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

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

Nic*_*las 44

随着两种语言的发展,在C++和C之间保持兼容性的努力很少.请注意,自1999年以来,可变长度堆栈数组已在C中,但未包含在C++ 11中.虽然它们通常不会引入相互矛盾的东西,但C++委员会并没有完全反过来确保C++ 11与C89之外的C版本兼容.

此外,这个功能在C++中会非常复杂,因为a struct只不过是一个class.一个匿名的struct/class应该具有常规struct/class的所有功能,是吗?否则,有什么意义呢?

构建无名者意味着什么struct?你会如何定义构造函数?简单的事情:

struct Foo
{
    struct
    {
        size_t &x;
    };
};
Run Code Online (Sandbox Code Playgroud)

根本不可能,因为内部struct没有构造函数.并且没有办法指定一个.A struct不能构建其中的另一个成员struct.

对于这样的事情:

struct Foo
{
    size_t outer;
    struct
    {
        void SomeFunc();
        size_t x;
    };
};
Run Code Online (Sandbox Code Playgroud)

什么this指针SomeFunc得到?什么类型的this,无名和未命名的类型?你怎么会SomeFunc在结构之外定义?名字SomeFunc不能Foo::SomeFunc,因为SomeFunc生活在一个内在的范围内.

这对C++来说太复杂了.当然不值得为添加复杂性而烦恼.

  • 这是合情合理的,虽然我可以想象限制会使它变得完全合理:POD,没有方法(继承或其他方式),而且完全公开,我认为,解决了你提出的问题.在我看来,匿名工会已经引入了许多这些问题,所以这些问题对我来说似乎并不"太复杂",除非是解决它们的动力太小. (17认同)
  • "构造一个无名结构意味着什么?你将如何定义构造函数?".同样的事情可以被要求建立一个无名的联盟.工会也可以有建设者. (13认同)
  • "你会如何定义构造函数?" 你没有,内部匿名结构成员是封闭类的成员,它可能像任何其他成员一样初始化它们. (5认同)