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
Vale la pena notare che questo è undefined Behavior ™ – Puppy
Perché non funziona prima del C++ 11? – Earlz
@Earlz 'nullptr' non esisteva prima di C++ 11. – hvd