std::string_view 的 noexcept 构造函数

noexcept constructor of std::string_view

根据 the documentation,std::string_view 有一个采用 const char *std::size_t 的构造函数,未声明 [​​=15=]:

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

另一方面,the documentation 还声明用户定义的文字 operator""sv,在我见过的所有实现中都是该构造函数的简单包装,被声明为 noexcept:

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

你知道造成这种差异的原因吗?构造函数什么时候可以抛出?

对于构造函数

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

您可以将任何内容作为字符串传递:

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

因此,此函数没有 (i.e., accepts all inputs), and is not marked noexcept per N3279 Conservative use of noexcept in the Library — marking it noexcept would prevent libraries from including tests to help users discover bugs in their code (in debug mode, of course). (See 以获取更多信息。)


另一方面,UDL运营商

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

翻译文字时通常由语言调用:

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

不可能传入无效的指针值,所以运算符是noexcept。当然,你可以直接用无效值调用运算符,但这不是标准库应该处理的问题。