Итак, сегодня я написал довольно сложно найти ошибку, где я инициализировал std :: string для nullptr (а не указатель на std :: string, но само значение). Я обнаружил, что это возможно только в C++ 11 или более поздней версии с clang.Почему вы можете назначить nullptr для 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;
}
Как вы можете видеть, я попытался назначая nullptr к только случайный экземпляр класса и это не сработало. Какая магия в строке, которая позволяет этому работать, и каким образом это даже действительный синтаксис? Я предположил, что в этом случае мне будет встречена ошибка выбора типа.
Для справки я скомпилирован с этим:
clang++ test.cpp -O3 -g -fno-inline -std=c++11 -Wall
Он не дал форму предупреждений, хотя бы ошибка, если не с помощью C++ 11
Стоит отметить, что это Undefined Behavior ™ – Puppy
Почему это не работает до C++ 11? – Earlz
@Earlz 'nullptr' не существовало до C++ 11. – hvd