Добавить проверку на `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` и в его случае инициализировать пустую строку

-9
рейтинг
1 комментарий
yndx-antoshkka

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

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

std::string s;

if(myService.isOnline()){

    s = myService.name();

}

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

или

const char *str = "";

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

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