Beim Klingeln (Stamm) kann ich ein Objekt weiterleiten, das später mit constexpr
wie folgt definiert wird:
Gcc 4.8 mag das nicht und sagt mir, dass die Vorwärtsdeklaration und die Definition sich in constexpr
-ness unterscheiden. GCC spricht die Wahrheit, oder ist das nur ein GCC-Bug?
Die wirkliche Antwort ist, dass gcc einfach falsch ist, clang hat recht. Der obige Code sollte kompiliert werden, und es wird in gcc 4.9. Oder so sagt diesen Fehlerbericht .
Ich kann keine Sprache in meiner Kopie des C ++ 11-Standards finden, der explizit verbietet, dass constexpr
-ness falsch zwischen einer Deklaration und einer Definition passt, aber ich sehe Sprache, die constexpr
explizit verbietet Wird mit extern
verwendet (Abschnitt 7.1.5), und ich sehe auch eine Sprache, die den Initialisierer für eine Variable static
constexpr
auf Klassenebene in der Klasse benötigt. Da der Nutzen von constexpr
deutlich reduziert wird, wenn die Definition der Variablen oder ihres Typs nicht verfügbar ist, ist es wahrscheinlich, dass constexpr
-Variablen definiert werden müssen (oder für static
-Klassenmitglieder initialisiert werden müssen) ) wenn sie erklärt werden.
Als Workaround könnten Sie vielleicht einen extern
Alias für die Variable angeben. Das würde dir erlauben, seine Adresse zu nehmen, und das ist das Einzige, was ich mir vorstellen kann, dass eine Vorwärtsdeklaration es erlauben würde. Zum Beispiel:
Seitennotiz: Ich weiß, dass sie in C ++ 14 constexpr
noch einmal besucht / besucht haben, daher ist es möglich, dass es in Clang funktioniert, weil es eine Entwurfsspezifikation von C ++ 14 implementiert.