Wie kann ich ein conexpr-Objekt im Namensraumbereich weiterleiten?

8

Beim Klingeln (Stamm) kann ich ein Objekt weiterleiten, das später mit constexpr wie folgt definiert wird:

%Vor%

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?

    
Eric Niebler 13.11.2013, 16:16
quelle

2 Antworten

4

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 .

    
Eric Niebler 19.11.2013, 01:29
quelle
5

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:

%Vor%

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.

    
Adam H. Peterson 13.11.2013 23:50
quelle

Tags und Links