Ich habe den folgenden C ++ 11 Code (vereinfachte Version):
%Vor%GCC 4.9.1 kompiliert und verknüpft diesen Code in Ordnung. Clang 3.5.0 dagegen klagt über eine undefinierte Referenz:
%Vor%Was ist richtig? Ist dieser Code legal oder nicht? Mein Verständnis der Regeln in Bezug auf statische Constexpr-Mitglieder (basierend hauptsächlich auf diese Frage ) ist, dass eine Definition außerhalb der Klasse nur benötigt wird, wenn die Adresse der Variablen verwendet wird. Aber ich nehme nicht die Adresse von Derived :: info oder verwende einen Verweis darauf; Ich übergebe es nur als Wert an den Base-Konstruktor.
Verschiedene Problemumgehungen, die ich gefunden habe:
Base ({"Foobar", 2})
. Diese Lösung würde funktionieren, aber es wird (meiner Meinung nach) hässlich, da mehr Mitglieder zu struct Info hinzugefügt werden. Aha, das Problem scheint der implizite Konstruktor Info(const Info &)
copy zu sein. Um den Verweis const Info &
auf diesen Konstruktor zu übergeben, muss die Adresse von Derived :: info übernommen werden.
Offenbar ist GCC bei der Optimierung des Kopierkonstruktors aggressiver als Clang. Wenn ich -fno-elide-constructors
verwende, beschwert sich GCC auch über einen undefinierten Verweis auf Derived :: info.
In jedem Fall scheint die Deklaration der Konstruktoren Base und Derived als constexpr das zu erreichen, was ich hier erreichen will: Base :: info wird zur Kompilierzeit initialisiert, anstatt von einer separaten Derived :: info at run kopiert zu werden Zeit.