Ich habe eine constexpr-Funktion geschrieben, die ein Array zurückgibt.
%Vor%g ++ 4.8 kompiliert den Code korrekt, gibt jedoch die folgende Warnung aus:
%Vor%Ist die Warnung in diesem Fall korrekt? Ist es inkorrekt, ein Array aus einer solchen constexpr-Funktion zurückzugeben, obwohl die Funktion zur Laufzeit eigentlich nie aufgerufen wird, nur während der Kompilierung?
clang 3.4
kompiliert diesen Code nicht, da sum(get_str())
kein consxpr ist und soweit ich sagen kann clang
ist hier korrekt, diese Zeile ( Sehen Sie es live ):
erzeugt den folgenden Fehler:
%Vor% Es ist keine gültige constexpr
aus zwei Gründen. Dies ruft ein undefiniertes Verhalten hervor, und dies ist explizit in einer Konstanten nicht zulässig Ausdruck , zusammenzufassen der Entwurf C ++ Standard Abschnitt 5.19
sagt:
Ein Bedingungsausdruck e ist ein Kernkonstantenausdruck, außer die Auswertung von e,
und enthält das folgende Aufzählungszeichen:
eine Operation, die ein undefiniertes Verhalten hätte
welcher Zugriff außerhalb seiner Lebensdauer wäre. Wir wissen, dass die Lebensdauer des Temporären in diesem Fall nicht vom Abschnitt 12.2
Temporäre Objekte erweitert wird, was besagt:
Der zweite Kontext ist, wenn eine Referenz an ein temporäres Objekt gebunden ist temporär, an das die Referenz gebunden ist oder das temporäre, das ist vollständiges Objekt eines Unterobjekts, an das die Referenz gebunden ist besteht für die Lebensdauer der Referenz außer
und enthält das folgende Aufzählungszeichen:
Die Lebensdauer einer temporären Bindung an den zurückgegebenen Wert in einer Funktion return statement (6.6.3) wird nicht erweitert; Das Temporäre ist zerstört am Ende des vollständigen Ausdrucks in der return-Anweisung.
Obwohl es zwar richtig ist, dass ein konstanter Ausdruck bei der Übersetzung nicht garantiert ist, haben wir eine Bemerkung im Abschnitt 5.19
Konstante Ausdrücke , die dies erwähnt ( Betonung meiner Zukunft ):
Hinweis: Konstante Ausdrücke können während der Übersetzung ausgewertet werden.-end Notiz]
Selbst wenn es garantiert war, durften wir immer noch kein undefiniertes Verhalten aufrufen.
Das zweite Problem besteht darin, dass consExpr-Verweise entweder auf Objekte mit statischer Speicherdauer oder auf Funktionen verweisen müssen, cppreference.com/w/Main_Page"> cppreference erwähnt dies sein Abschnitt Kernkonstante Ausdruck :
Referenzkonstantenausdruck ist ein Lvalue-Core-Konstantenausdruck das bezeichnet ein Objekt mit statischer Speicherdauer oder eine Funktion
und soweit ich das beurteilen kann, wird das im Abschnitt 5.19
Konstante Ausdrücke Absatz 4 behandelt, der besagt:
Jedes nicht statische Datenelement vom Referenztyp verweist auf ein Objekt mit statische Speicherdauer oder auf eine Funktion,
Die Funktion wird zur Laufzeit nie wirklich aufgerufen, nur während Zusammenstellung?
Nicht garantiert überhaupt von Standard. Der Compiler ist gut in der Lage, ihn zur Laufzeit aufzurufen.
constexpr
provisories sterben niemals , wenn der Compiler sie zur Kompilierungszeit aufruft. Der Compiler ist nicht verpflichtet.
Tags und Links arrays c++ gcc constexpr gcc-warning