Rückgabe einer C-Zeichenfolge in einer constexpr-Funktion: Warum keine Warnung vom Compiler?

8

Betrachten Sie den folgenden Code:

%Vor%

Ist das normal, dass mein Compiler keine Warnung anzeigt? Ist es definiertes Verhalten? Habe ich die Garantie, dass das Programm "Hello World!" anzeigt? Ich würde erwarten, dass "Hello World!" nicht über den Funktionsumfang hinausgeht ...

    
Vincent 28.07.2017, 06:54
quelle

2 Antworten

13

In C ++ Zeichenfolgenliterale haben statische Speicherdauer und leben, solange das Programm läuft. Ein Zeiger auf ein von f zurückgegebenes Zeichenfolgenliteral ist also immer gültig. Es ist keine Zuordnung oder Freigabe erforderlich.

Beachten Sie, dass Zeichenfolgenliterale den Typ const char[N] aufweisen, der in Ihrem Fall aufgrund von const char * type Deduction in auto abfällt. Wenn Sie std::string verwenden möchten, können Sie es direkt erstellen

%Vor%

oder verwenden Sie operator""s :

%Vor%

Da std::string jedoch kein Literaltyp ist, können die Werte nicht constexpr sein mehr.

    
lisyarus 28.07.2017, 07:02
quelle
5

Das ist der zweite Effekt von auto. Was Sie denken, ist nicht immer, was der Compiler entscheidet. Dies kann zu falschen Programmierer Erwartungen führen - die Regel ist hier Compiler immer gewinnen .

Fakt ist hier, dass str ein const char * zu einer (statischen Speicherdauer) string litteral ist. Es kann zum Zeitpunkt der Erstellung vollständig bestimmt werden, also ist es ein gültiger Constexpr.

    
Serge Ballesta 28.07.2017 07:28
quelle