Добавить проверку на `nullptr` в конструкторе `basic_string(const char_type *)`

Евгений Захаров
Евгений Захаров

Код

 ```

const char *str = nullptr;

if(myService.isOnline()){

    str = myService.name();

}

std::string s = str;

```

упадет на последней строке если условие не выполнится. Как следствие `std::string s = 0;` тоже упадет. Логичнее добавить проверну на `nullptr` и в его случае инициализировать пустую строку

-11
рейтинг
3 комментария
yndx-antoshkka

Эту тему очень долго обсуждали в международном комитете. Если вы передаёте нулевой указатель и std::string падает - это проблема того, что в вашей программе есть ошибка и она нарушает инвариант использования строки. Можно сделать так, чтобы строка не падала, однако это не исправит ошибку выше по коду (то место где сформировался нулевой указатель, когда он не должен был создаваться).

В приведённом выше примере можно исправить ситуацию:

std::string s;

if(myService.isOnline()){

    s = myService.name();

}

// Не нужно: std::string s = str;

или

const char *str = "";

Оба этих исправления не добавляют накладных расходов, в отличие от проверки на nullptr в констурукторе строки.

yndx-antoshkka
Обновлено 
Andrey Davydov

Еще одна попытка:

http://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p0903r2.pdf

Andrey Davydov
yndx-antoshkka

Проголосовали против этой идеи в Рапперсвиле:

* В C строка - это нуль терминированный массив символов (не nullptr! nullptr - не строка). Конструктор basic_string_view(const Char*) предназначен для работы со строками, и соответственно nullptr нарушает этот контракт.

* Если добавить проверку на nullptr - лучше не ставновится. Старый (до C++20) код по прежнемоу должен проверять на nullptr. Итого в переносимых библиотеках будет больше макросов или по прежнему будут проверки на nullptr

* Проблемы с консистентностью и мучения с обучением. В текущей ситуации можно учить людей, что все строки нельзя создвавть от nullptr. Если разрешить создавать string_view от nullptr, то придётся отвечать на вопросы "А почему у нас std::string от nullptr не конструируется? А почему мы не можем char*{nullptr} выводить в поток?"

yndx-antoshkka
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения