3

Betrachten Sie folgendes Programm. Ich habe versehentlich einen Fehler gemacht. Konstruktor delegiert sich in g ++ & clang ++

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

Der obige Code kompiliert & läuft fein in einigen Versionen von g ++ wie g ++ 4.8.1 (siehe Live-Demo here) & Klirren ++ 3.6.0 (siehe Live-Demo here) & in MSVC++ 2015 aber Abstürze zur Laufzeit. Es gibt mir Segmentierungsfehler Fehler. Ich denke, es ist aufgrund der Rekursion ich rekursiv den Konstruktor aufrufen. Aber die meisten neueren Versionen von g ++ & Klirren ++ schlagen fehl diesen Code zu kompilieren, indem folgende Fehler geben:

g ++ 4.9.2 gibt Fehler folgenden (siehe Live-Demo here)

prog.cc: In constructor 'T::T()': 
prog.cc:3:10: error: constructor delegates to itself 
    T() : T() { 

Klirren ++ ergibt folgende Fehler (Siehe Live-Demo here)

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

So, hier ist die Frage, welche Compiler hier ist Standard nach? Ist es ein Fehler in einem dieser Compiler? Was genau passiert hier im obigen Programm? Korrigiere mich Wenn ich irgendwo in meinem Verständnis falsch liege. Warum zeigt dasselbe Programm in verschiedenen Versionen dieser Compiler unterschiedliches Verhalten?

+2

_ „? Warum gleiche Programm unterschiedliche Verhalten in verschiedenen Versionen dieser Compiler zeigt“ _ Da die neueren Compiler sind besser die Älteren. Ihnen zu sagen, dass Ihr Code defekt ist, ist besser als ein Absturz zur Laufzeit. –

Antwort

8

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

If a constructor delegates to itself directly or indirectly, the program is ill-formed; no diagnostic is required.

Alle Compiler sind richtig - der Code gebrochen, und der Compiler ist nicht erforderlich, Sie so zu sagen. An diesem Punkt haben Sie UB; von [intro.compliance] ¶2:

If a program contains a violation of a rule for which no diagnostic is required, this International Standard places no requirement on implementations with respect to that program.

+0

Ich denke, Verhalten sollte nicht definiert sein im Falle von schlecht geformten NDR nicht Umsetzung definiert !!! – Destructor

Verwandte Themen