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 ...
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
oder verwenden Sie operator""s
:
Da std::string
jedoch kein Literaltyp ist, können die Werte nicht constexpr
sein mehr.
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.
Tags und Links c++ c++14 constexpr string-literals c-strings