构造函数在g ++和clang ++中委托给自己

Des*_*tor 4 c++ constructor language-lawyer c++11 delegating-constructor

考虑以下程序.我不小心弄错了.

struct T {
    int s;
    T() : T() {
        s=9;
    }
};
int main() {
    T t;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在某些版本的g ++中编译和运行,如g ++ 4.8.1(请参阅此处的实时演示)&clang ++ 3.6.0(请参阅此处的实时演示)和MSVC++ 2015,但在运行时崩溃.它给了我分段错误错误.我认为这是由于递归我的意思是递归调用构造函数.但是最新版本的g ++&clang ++无法通过提供以下错误来编译此代码:

g ++ 4.9.2给出以下错误(请参阅此处的实时演示)

prog.cc: In constructor 'T::T()':
prog.cc:3:10: error: constructor delegates to itself
  T() : T() {
Run Code Online (Sandbox Code Playgroud)

clang ++给出以下错误(请参阅此处的在线演示)

main.cpp:4:8: error: constructor for 'T' creates a delegation cycle [-Wdelegating-ctor-cycles]
        T() : T() {
              ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

那么,这里的问题是根据标准,哪个编译器就在这里?这是其中一个编译器的错误吗?上面的程序究竟发生了什么?纠正我如果我在理解的某个地方错了.为什么同一程序在这些编译器的不同版本中表现出不同的行为?

ild*_*arn 9

从C++ 11开始,[class.base.init]6:

如果构造函数直接或间接地委托给自己,程序就是格式错误; 无需诊断.

所有编译器都是正确的 - 代码被破坏了,编译器不需要告诉你.此时你有UB; 来自[intro.compliance]2:

如果程序包含违反不需要诊断的规则,则本国际标准不要求对该程序的实施.