2016-05-13 5 views
13

Si consideri il seguente frammento di codice:L'assegnazione di un numero a std :: string è ora consentita?

#include <iostream> 
int main() { 
    std::string foo; 
    foo = -1; // why is the compiler not complaining about this? 
    std::cout << "1" << std::endl; 
    std::cout << foo << std::endl; 
    std::cout << "2" << std::endl; 
} 

uscita effettiva (sia in modalità ideone.com C++ 14 e GCC 4.8.4):

<no output>

Domande:

  1. Perché lo snippet di codice è stato compilato?
  2. Commentando foo = -1, ottengo lo stdout corretto (1 e 2). Cosa ha compilato il compilatore con foo = -1; che causa il successivo cout s fallire?
+0

Correlati? http://stackoverflow.com/questions/32563648/stdstring-initialization-with-a-bool – CinCout

+0

Perché non esistono costruttori che accettano numeri interi per il contenitore stringa. O fai la tua implementazione o usi numeri con stringhe. – Joel

+0

@Joel Ma perché l'assegnazione lo accetta? –

risposta

11
foo = -1; 

risolve std::string::operator=(char) dal -1 è un int e int può, in teoria, convertito char.

Non è chiaro per me cosa dice lo standard quando lo int non rappresenta uno char valido. Sembra nella tua implementazione, il programma si blocca.

Aggiornamento

Dalla C++ 11 standard (sottolineatura mia):

3.9.1 tipi fondamentali

1 oggetti dichiarati come caratteri (char) devono essere abbastanza grande da memorizzare qualsiasi membro del set di caratteri di base dell'implementazione. Se un personaggio di questo set è memorizzato in un oggetto personaggio, il valore integrale dell'oggetto è uguale al valore della forma letterale a carattere singolo di quel carattere. È definito dall'implementazione se un oggetto char può contenere valori negativi.

Sembra che dovrete consultare la documentazione del compilatore per capire se permette char oggetto per contenere i valori negativi e, se lo fa, come fa a trattare tali oggetti.

+1

Cos'è un 'char' non valido? –

+0

@BenjaminLindley, riformulato quella parte. –

+1

Suppongo che non interpreti il ​​-1 come EOF – Christophe

5

char è un tipo integrale in C++. std::string definisce un operatore di assegnamento:

std::string& operator=(char); 

Da int convertiti char liberamente in questo contesto, non diagnostico è dato. (E 'strano come migliori intenzioni spianare la strada per l'inferno, no?)

Dal (char)-1 non è probabilmente un membro valida se il personaggio di esecuzione impostato sulla vostra piattaforma, il flusso entra in uno stato di errore e ci rimarrà, l'output di niente , fino a quando il bit di errore non viene cancellato.

EDIT questo è un bug di ideone.Se il flusso di output contiene un carattere "illegale", l'intero flusso non viene mostrato, anche le parti prodotte e svuotate prima del carattere errato. Utilizzare un altro compilatore online per verificare.

+0

Quindi 'foo = -1;' imposta il flusso su uno stato di errore? Poiché l'eccezione è parte integrante di C++, non riesco a capire perché utilizza ancora un meccanismo di "stato di errore" invisibile. –

+0

@ ZachSaw è possibile impostare iostreams per generare eccezioni, ma non è l'impostazione predefinita. –

+0

@ZachSaw [vedi questo] (http://stackoverflow.com/questions/3180268/why-are-c-stl-iostreams-not-exception-friendly). –

1

Questi sono l'operatore = sovraccarichi per la classe string: -

basic_string& operator=(const basic_string& str); 
basic_string& operator=(basic_string&& str) noexcept(allocator_traits<Allocator>::propagate_on_container_move_assignment::value ||  allocator_traits<Allocator>::is_always_equal::value); 
basic_string& operator=(const charT* s); 
basic_string& operator=(charT c); 
basic_string& operator=(initializer_list<charT>); 

speranza che ha un senso perché quello compilato bene.

Ora veniamo alla tua domanda sul motivo per cui non c'è uscita. Ho modificato leggermente il codice: -

#include <iostream> 
int main() { 
    std::string foo; 
    foo = -1; // why is the compiler not complaining about this? 
    char ch = 65; 
    std::cout << "1" << std::endl; 
    std::cout << foo << std::endl; 
    std::cout << ch << std::endl; 
    //change ch to -1 ... ascii 
    ch = -1; 
    std::cout << ch << std::endl; 
    std::cout << "2" << std::endl; 
} 

Riesci a indovinare qual è l'uscita? Yup pensare in termini di ASCII: -

1 
  
A 
  
2 

Questo è esattamente il motivo per cui non si ha l'uscita per il -1.

Compilatore - MinGW - std = C++ 14 - non sono sicuro del motivo per cui IDEONE rovina il flusso di output completo nel tuo caso.