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)
那么,这里的问题是根据标准,哪个编译器就在这里?这是其中一个编译器的错误吗?上面的程序究竟发生了什么?纠正我如果我在理解的某个地方错了.为什么同一程序在这些编译器的不同版本中表现出不同的行为?
从C++ 11开始,[class.base.init]6:
如果构造函数直接或间接地委托给自己,程序就是格式错误; 无需诊断.
所有编译器都是正确的 - 代码被破坏了,编译器不需要告诉你.此时你有UB; 来自[intro.compliance]2:
如果程序包含违反不需要诊断的规则,则本国际标准不要求对该程序的实施.