Wie kann eine Variable sowohl constexpr als auch nicht constexpr sein?

8

Ich habe einen constexpr string Typ gemacht, den ich StaticString nenne. Ich habe diese Idee von this Website.

Ich habe einige seltsame Probleme mit dem Compiler, der eine Variable als constexpr in einer Zeile behandelt und dann nicht als constexpr in der nächsten Zeile.

Hier ist der Code:

%Vor%

Und hier ist die Definition von StaticString :

%Vor%

Meine Frage ist also: Warum wird world in einer Zeile als constexpr behandelt, aber nicht als nächste?

HINWEIS: Dies ist der Fehler, den ich bekomme:

%Vor%

Ich verwende auch gcc

    
DarthRubik 28.05.2016, 22:34
quelle

1 Antwort

7

Diskussion

Ihre world Variable ist constexpr , aber operator+ im Ausdruck:

%Vor%

obwohl als constexpr nicht markiert ist. Weil in seiner Rückmeldung:

%Vor%

aufgrund der Erstellung der temporären StaticString(str) -Zeiger auf nicht-statische Speicherdauer-Provisorien werden ebenfalls erstellt. Dies wird der Tatsache zugeschrieben, dass Sie in Ihren StaticString -Objekten Adressen von Nicht-statischen Speicherdauerprovisorien speichern und diese Art von Zeigern in konstanten Ausdrücken nicht erlaubt sind.

Begründung

Nach dem Standard §5.20 / p5 Konstante Ausdrücke [expr.const] ( Betonung meiner ):

  

Ein konstanter Ausdruck ist entweder ein glvalue -Kernkonstantenausdruck   Der Wert bezieht sich auf eine Entität, die ein zulässiges Ergebnis von a ist   konstanter Ausdruck (wie unten definiert) oder eine Prvalue-Kernkonstante   Ausdruck, dessen Wert die folgenden Bedingungen erfüllt:

     

(5.1) - wenn der Wert ein Objekt der Klassenart ist, jede nicht statische Daten   Mitglied des Referenztyps bezieht sich auf eine Entität, die zulässig ist   Ergebnis eines konstanten Ausdrucks,

     

(5.2) - Wenn der Wert vom Zeigertyp ist, enthält er die Adresse von a   Objekt mit statischer Speicherdauer, die Adresse nach dem Ende eines solchen   ein Objekt (5.7), die Adresse einer Funktion oder ein Nullzeigerwert,   und

     

(5.3) - Wenn der Wert ein Objekt der Klasse oder des Array-Typs ist, jeder   Unterobjekt erfüllt diese Einschränkungen für den Wert.

     

Eine Entität ist ein zulässiges Ergebnis eines konstanten Ausdrucks, wenn es ein ist   Objekt mit statischer Speicherdauer, die entweder nicht temporär ist   Objekt oder ist ein temporäres Objekt, dessen Wert das obige erfüllt   Einschränkungen, oder es ist eine Funktion.

.

    
101010 28.05.2016 22:44
quelle