noexcept конструктор std :: string_view - PullRequest
4 голосов
/ 28 мая 2020

Согласно документации , std :: string_view имеет конструктор, который принимает const char * и std::size_t, который не объявлен noexcept:

constexpr basic_string_view(const CharT* s, size_type count);

С другой стороны, в документации также указано, что определенный пользователем литерал operator""sv, который во всех реализациях, которые я видел, является простой оболочкой для этого конструктора, объявлен noexcept:

constexpr std::string_view operator "" sv(const char* str, std::size_t len) noexcept;

Вы знаете причину такой разницы? Когда это конструктор может бросить?

1 Ответ

4 голосов
/ 28 мая 2020

Для конструктора

constexpr basic_string_view(const CharT* s, size_type count);

вы можете передать что угодно в виде строки:

char c{'X'};
std::string_view sv{&c, 100}; // oops

Следовательно, эта функция не имеет широкого контракта (т.е. , принимает все входные данные) и не отмечен noexcept на N3279 Консервативное использование noexcept в библиотеке - отметка noexcept помешает библиотекам включать тесты, чтобы помочь пользователям обнаруживать ошибки в своем коде (в режиме отладки, конечно). (См. Может ли std :: string :: compare (const char *) вызвать исключение? для получения дополнительной информации.)


С другой стороны, оператор UDL

constexpr std::string_view operator "" sv(const char* str, std::size_t len) noexcept;

обычно вызывается языком при переводе литерала:

using std::string_literals;
auto sv = "foo"sv;

Нет возможности передать недопустимые значения указателя, поэтому оператор noexcept. Конечно, вы можете напрямую вызвать оператор с недопустимым значением, но это не та проблема, с которой должна справиться стандартная библиотека.

...