4

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

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.

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

4

1 回答 1

9

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

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

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

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

于 2016-07-20T16:47:01.347 回答