Ich habe eine Vorlage erstellt, die die angegebenen Daten hinzufügt. Wenn ich es so verwende, deklariert der Compiler in_1 und in_2 als const char *, und der Code kompiliert nicht.
%Vor%Wenn ich in_1 und in_2 std :: string deklariere, funktioniert es wie ein Charm.
Warum kann der Compiler diese Zeichenfolgen nicht (oder nicht) automatisch mit std :: string deklarieren?
Der Grund, warum Sie nicht in Ihre automatische Variable schreiben können, ist, dass es ein const char * oder const char [1] ist, weil das der Typ einer String-Konstante ist.
Der Punkt von auto ist die Auflösung auf den einfachsten möglichen Typ, der für den Typ der Zuweisung "funktioniert". Der Compiler "freut sich nicht darauf zu sehen, was Sie mit der Variable machen", deshalb versteht es nicht, dass Sie später in diese Variable schreiben und sie zum Speichern einer Zeichenkette verwenden wollen, also würde std :: string dies tun macht mehr Sinn.
Ihr Code könnte auf viele verschiedene Arten funktionieren, hier ist eine, die einen Sinn ergibt:
%Vor% String-Literale haben den Typ const char[N+1]
, nicht std::string
.
Dies ist nur eine Tatsache der Sprache.
Sie hätten es so machen können, dass auto
einen speziellen Fall für String-Literale hat, aber das wäre inkonsistent, überraschend und von geringem Nutzen.
In C ++ 14 können Sie einfach ein s
nach dem Stringliteral hinzufügen, und es wird ein std::string
anstelle von const char*
string erstellt.
Er kann zusammen mit auto
verwendet werden, um ein std::string
:
Diese Schleife funktioniert für std::string
(mit s
wurde dem String-Literal hinzugefügt), aber nicht für const char*
type String-Literale:
Referenz für den Operator "" .