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
:
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
Ihre world
Variable ist constexpr
, aber operator+
im Ausdruck:
obwohl als constexpr
nicht markiert ist. Weil in seiner Rückmeldung:
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.
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.
.
Tags und Links c++ constexpr compile-time-constant