为什么gcc允许没有用户声明的默认构造函数而不是clang的const对象?

10 c++ gcc clang

最近为什么const对象需要用户提供的默认构造函数?被标记为重复为什么C++需要用户提供的默认构造函数来默认构造一个const对象?.我正在使用colirurextexter来测试各种版本的gcc(g ++ - 4.7,g ++ - 4.8,g ++ - 4.9)和clang(3.4和3.5)以查看是否在较新版本的编译器中引入了这种行为.这里我们分别从两个问题中提取了两个测试用例:

class A {
public:
    void f() {}

};

int main()
{
    A a;       // OK
    const A b; // ERROR

    a.f();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和:

struct B{
  B():x(42){}
  int doSomeStuff() const{return x;}
  int x;
};

struct A{
  A(){}//other than "because the standard says so", why is this line required?

  B b;//not required for this example, just to illustrate
      //how this situation isn't totally useless
};

int main(){
  const A a;
}
Run Code Online (Sandbox Code Playgroud)

clang错误:

 error: default initialization of an object of const type 'const A' requires a user-provided default constructor
  A const a;
          ^
Run Code Online (Sandbox Code Playgroud)

预期但不是gcc,也不是MSVC.我想也许我可能会发疯,因为标准引用清楚地说:

§8.5

6默认初始化T类型的对象意味着:

- 如果T是一个(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);

[...]

如果程序要求对const限定类型T的对象进行默认初始化,则T应为具有用户提供的默认构造函数的类类型.

11如果没有为对象指定初始值设定项,则默认初始化该对象; [...]

第二个问题中出现的非POD语言似乎在n3337中缺失,所以也许我错过了一些可能已经改变的东西.这是一个错误,重复还是我错过了什么?

bam*_*s53 6

该规范目前需要用户提供的默认构造函数,但看起来GCC正在实现基于DR 253的更改,该更改表示如果在没有用户提供的默认构造函数的情况下初始化所有子对象,则不需要用户提供的默认构造函数.

此更改仅为草稿状态,尚未被接受且不属于标准.所以我认为这是GCC开发人员想要的行为,但我不确定这是否是符合标准的扩展.

这是对第一个导致GCC产生错误的示例的更改:

class A {
public:
    void f() {}

    int i;
};

int main()
{
    A a;       // OK
    const A b; // ERROR

    a.f();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,gcc使用-fpermissive标志将错误降级为警告.

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42844