Warum deklariert "auto" Zeichenfolgen als const char * anstelle von std :: string?

8

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?

    
Magnus 01.01.2014, 14:05
quelle

4 Antworten

4

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%     
Yanshof 01.01.2014, 14:08
quelle
3

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.

    
quelle
0

auto deklariert die Variable als den Kompilierzeittyp des Ausdrucks, zu dem Sie ihn initialisieren.

String-Literale haben den Typ const char* , nicht std::string .

    
SLaks 01.01.2014 14:07
quelle
0

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 :

zu erstellen %Vor%

Diese Schleife funktioniert für std::string (mit s wurde dem String-Literal hinzugefügt), aber nicht für const char* type String-Literale:

%Vor%

Referenz für den Operator "" .

    
Alexander 05.12.2017 09:04
quelle

Tags und Links