构造函数在 G++ 和 CLang++ 中委托给自身

constructor delegates to itself in g++ & clang++

本文关键字:G++ CLang++ 构造函数      更新时间:2023-10-16

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

struct T {
    int s;
    T() : T() {
        s=9;
    }
};
int main() {
    T t;
}

上面的代码编译&在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() {

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

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

所以,这里的问题是,根据标准,哪个编译器在这里?这是其中一个编译器的错误吗?上面的程序到底发生了什么?如果我的理解有错,请纠正我。为什么同一个程序在不同版本的编译器中表现出不同的行为?

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

如果构造函数直接或间接地委托给自己,则程序是不正确的;不需要进行诊断。

所有的编译器都是对的——代码是坏的,编译器不需要告诉你;来自[介绍合规性]¶2:

如果某个程序违反了不需要诊断的规则,则本国际标准对该程序的实现没有任何要求。