2015-05-15 3 views
6

Итак, сегодня я написал довольно сложно найти ошибку, где я инициализировал 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

ответ

13

Это просто потому, что есть constructors (число (5) в ссылке) и assignment operators (номер (3) в ссылке) для std::string, принимающих const char*, и, следовательно, совпадений nullptr.

Перед C++ 11 (и поэтому до nullptr) возникла такая же проблема, когда вы пытались построить из 0 или NULL. Все эти случаи были незаконными и приводили к неопределенному поведению, хотя хотя бы один STL (RogueWave?) Принял его в прошлом и создал пустую строку.

+6

Стоит отметить, что это Undefined Behavior ™ – Puppy

+0

Почему это не работает до C++ 11? – Earlz

+0

@Earlz 'nullptr' не существовало до C++ 11. – hvd

Смежные вопросы