Подтвердить что ты не робот

Назначить nullptr для std::string безопасно?

Я работал над небольшим проектом и пришел к ситуации, когда произошло следующее:

std::string myString;
#GetValue() returns a char*
myString = myObject.GetValue();

Мой вопрос: если GetValue() возвращает NULL myString становится пустой строкой? Это undefined? или это будет segfault?

4b9b3361

Ответ 1

Интересный маленький вопрос. Согласно стандарту С++ 11, сек. 21.4.2.9,

basic_string(const charT* s, const Allocator& a = Allocator());

Требуется: s не должно быть нулевым указателем.

Поскольку стандарт не запрашивает библиотеку исключение, когда это конкретное требование не выполняется, казалось бы, передача нулевого указателя вызвала поведение undefined.

Ответ 2

Это ошибка времени выполнения.

Вы должны сделать это:

myString = ValueOrEmpty(myObject.GetValue());

где ValueOrEmpty определяется как:

std::string ValueOrEmpty(const char* s)
{
    return s == nullptr ? std::string() : s;
}

Или вы можете вернуть const char* (это имеет смысл):

const char* ValueOrEmpty(const char* s)
{
    return s == nullptr ? "" : s; 
}

Если вы вернетесь const char*, то на сайте-вызове он преобразуется в std::string.

Ответ 3

Мой вопрос: если GetValue() возвращает NULL, myString становится пустой строкой? Это undefined? или это будет segfault?

Это поведение undefined. Компилятор и время выполнения могут делать все, что захотят, и по-прежнему быть совместимыми.