Perché in C++, le stringhe letterali (come "Hello"
non sono di tipo std::string
. Essi sono array char semplici o stringhe in stile C.
Così, per la linea const std::string message = "Hello" + ", world" + exclam;
, i tipi il compilatore deve lavorare con sono :
const std::string message = const char[6] + const char[8] + std::string;
e data l'associatività di +
, le operazioni che deve svolgere sono:
const std::string message = ((const char[6] + const char[8]) + std::string);
Cioè, l'addizione all'estrema sinistra deve essere valutata per prima, e il risultato è passato all'aggiunta più a destra.
Quindi il compilatore prova a valutare const char[6] + const char[8]
. Non è stata definita alcuna aggiunta per gli array. Gli array sono convertiti implicitamente in puntatori, ma questo non aiuta il compilatore. Ciò significa che termina con const char* + const char*
e non è stata definita alcuna aggiunta per i puntatori.
A questo punto, non si sa che si desidera convertire il risultato in std::string
.
Tuttavia, nel secondo esempio:
const std::string hello = "Hello";
const std::string message = hello + ", world" + "!";
funziona, perché le operazioni il compilatore avrebbe visto erano std::string + const char[8] + const char[2]
. Qui, la prima aggiunta può essere convertita in std::string + const char*
e qui l'operatore di addizione è definito e restituisce un std::string
. Quindi il compilatore ha calcolato con successo la prima aggiunta, e dal momento che il risultato era una stringa, la seconda aggiunta appare così: std::string + const char[2]
, e come prima, questo non è possibile, ma la matrice può essere convertita in un puntatore, e quindi il compilatore è in grado di trovare un operatore di addizione che funziona, di nuovo risultante in un std::string
.
Perché non fare: const std :: string message = "Ciao, mondo" + esclam; –
Benvenuti nel sito! Solo FYI, se c'è una risposta che ti piace, assicurati di accettarla. È più probabile che tu aiuti in futuro. – JasCav