Inizializzazione della lista di copia? Perché questo compila?

Inizializzazione della lista di copia? Perché questo compila?

std::string ha un costruttore di modelli che costruisce una stringa da una coppia di iteratori inizio/fine. I letterali stringa in C++ passano a const char* S. E i puntatori sono iteratori. Pertanto, l'inizializzazione dell'elenco ha selezionato il costruttore della coppia inizio/fine.

Hai ricevuto un errore di runtime perché i due puntatori non creano effettivamente un intervallo valido, che non può essere determinato in fase di compilazione (generalmente).


std::string ha un sovraccarico del costruttore sotto forma di

template< class InputIt >
basic_string( InputIt first, InputIt last,
              const Allocator& alloc = Allocator() );

e questo viene chiamato perché "str1" e "str2" decade a const char* 's e const char* è un tipo di iteratore accettabile.

Si verifica un arresto anomalo perché l'"intervallo iteratore" passato alla funzione non è valido.


Che usano il costruttore con iteratori di std::string (6.).

template< class InputIt >
constexpr basic_string( InputIt first, InputIt last,
                        const Allocator& alloc = Allocator() );

Con [InputIt =const char* ].

Quindi hai UB come intervallo {"str1", "str2"} non è valido.