MSVC direkte Konstruktoraufruferweiterung

8

In diese Antwort , tloveless wies darauf hin, dass es in MSVC möglich ist, this->foo::foo(42); für die Konstruktordelegierung zu verwenden, um einen Konstruktor direkt aufzurufen:

%Vor%

Ich war überrascht, dass dies sogar in MSVC kompiliert wird; clang ++, g ++ und ich stimmen zu, dass es illegal ist, z. [class.ctor] / 2 "Da Konstruktoren keine Namen haben, sind sie nie während der Namenssuche gefunden "

MSVC gibt jedoch keine Warnung mit /Wall und ohne die Spracherweiterungen /Za in MSVC12 Update 1 (2013) und MSVC10 SP1 (2010) aus.

Die Ausgabe ist:

%Vor%

in beiden Versionen. Es wird also kein temporäres erstellt, sondern ein Konstruktor namens.

Fragen:

  1. Wie heißt diese Erweiterung?
  2. Wird es nicht als Erweiterung betrachtet? ( /Za und die Liste der Erweiterungen nicht scheint so zu denken)
  3. Gibt es eine Dokumentation zur offiziellen Beschreibung dieser Funktion?

(Ich habe diese Frage mit dem Tag [delegating-constructors] markiert, da sie mich stark an diese Funktion erinnert)

Meta-Info: Ich bin mir fast sicher, dass diese Frage ein Duplikat ist, da dieses Feature etwas bekannt ist. Siehe zum Beispiel diese Antwort zu einer "ähnlichen Frage". Bitte zögere nicht, dies als dup zu beenden, wenn du eine Antwort finden kannst, die diese Funktion beschreibt.

    
dyp 28.04.2014, 17:26
quelle

1 Antwort

1

Es ist kein Konstruktor, der delegiert. Versuchen Sie folgenden Code:

%Vor%

Je nach Ausgabefeld wird "c" zweimal initialisiert, aber nur einmal zerstört. Wie zneak bemerkt, ist es ähnlich wie new (this) foo(42) .

    
Dmytro Ovdiienko 08.05.2014 16:23
quelle