2015-05-15 18 views
6

Così oggi ho scritto un bug abbastanza difficile da trovare dove ho inizializzato un file std :: string in nullptr (non un puntatore a std :: string, ma il valore stesso). Ho scoperto che è possibile fare solo in C++ 11 o versioni successive con clang.Perché puoi assegnare nullptr a std :: string?

#include <string> 
#include <iostream> 

using namespace std; 
class Meh{ 
    int x; 
}; 
class Foo 
{ 
private: 
    std::string x=nullptr; 
    Meh y=nullptr; //remove this line and it compiles 
public: 
    std::string z=nullptr; 
}; 

int main(void) 
{ 
    Foo f; 
    cout << f.z; 
    return 0; 
} 

Come potete vedere, ho provato l'assegnazione nullptr a solo un esempio casuale di una classe e non ha funzionato. Che magia c'è nella stringa che permette a questo di funzionare, e in che modo questa sintassi è valida? Ho pensato che avrei incontrato un errore di tipo casting in questo caso.

Per riferimento ho compilato con questo:

clang++ test.cpp -O3 -g -fno-inline -std=c++11 -Wall 

ha dato alcuna forma di avvertimenti, anche se sarebbe errore fuori se non si utilizza C++ 11

risposta

13

Questo è semplicemente perché ci sono constructors (numero (5) nel collegamento) e assignment operators (numero (3) nel collegamento) per std::string che accetta uno const char* e quindi le corrispondenze nullptr.

Prima di C++ 11 (e quindi prima di nullptr), si verificava lo stesso problema quando si tentava di costruire da 0 o NULL. Tutti questi casi erano illegali e comportano un comportamento indefinito, sebbene almeno un STL (RogueWave?) L'abbia accettato in passato e abbia generato una stringa vuota.

+6

Vale la pena notare che questo è undefined Behavior ™ – Puppy

+0

Perché non funziona prima del C++ 11? – Earlz

+0

@Earlz 'nullptr' non esisteva prima di C++ 11. – hvd

Problemi correlati