constexpr Array zurückgeben, gcc Warnung

8

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?

    
Xeno 31.08.2014, 19:56
quelle

2 Antworten

2

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 ):

%Vor%

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,

    
Shafik Yaghmour 01.09.2014, 03:17
quelle
1
  

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.

    
Puppy 31.08.2014 20:01
quelle