Для конструктора
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
. Конечно, вы можете напрямую вызвать оператор с недопустимым значением, но это не та проблема, с которой должна справиться стандартная библиотека.