首页 文章

根据C 11标准中的§12.1/ 4,代码不应编译

提问于
浏览
7

§12.1/4: and its first bullet point

类X的默认构造函数是类X的构造函数,可以在没有参数的情况下调用 . 如果类X没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值(8.4) . 隐式声明的默认构造函数是其类的内联公共成员 . 如果出现以下情况,则类X的默认默认构造函数被定义为已删除:X是一个类似于联合的类,其变体成员具有非平凡的默认构造函数,

根据这个要点,这个片段不应该编译,因为 struct A 是一个类似联合的类(它包含一个匿名联合),它有一个变体成员, B b; 带有一个非平凡的默认构造函数 . 但code compiles without a problem in vc++, clang++ and g++ .

#include <iostream>

struct B { B(): i(10) {} int i; };

struct A
{
    union{ int y = 1; double x; };
    int i;
    A(int j) : i{j} {};
    B b;
    A() = default;
};

int main() {
    A a;
}

1 回答

  • 13

    变体成员是

    union{ int y = 1; double x; };
    

    并且他们都没有一个非平凡的构造函数 .

    这在§9.5/ 8中定义:

    9.5 Unions [class.union] 8类似联盟的类是具有匿名联合作为直接成员的联合或类 . 类似联合的类X具有一组变体成员 . 如果X是联合,则其变体成员是非静态数据成员;否则,其变体成员是作为X成员的所有匿名联合的非静态数据成员 .

相关问题