4

根据文档, std::string_view 有一个构造函数,它采用 aconst char *和 a std::size_t,但未声明noexcept

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

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

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

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

4

1 回答 1

4

对于构造函数

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

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

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

因此,此函数没有广泛的合同(即接受所有输入),并且未根据库中的noexceptN3279保守使用noexcept标记 - 标记它noexcept会阻止库包含测试以帮助用户发现其代码中的错误(在调试模式,当然)。(有关更多信息,请参阅Can std::string::compare(const char*) throw an exception?


另一方面,UDL 运算符

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

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

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

不存在传入无效指针值的可能性,因此运算符为noexcept. 当然,您可以使用无效值直接调用运算符,但这不是标准库应该处理的问题。

于 2020-05-28T09:40:15.233 回答