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
。当然,你可以直接用无效值调用运算符,但这不是标准库应该处理的问题。
根据 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
因此,此函数没有 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
。当然,你可以直接用无效值调用运算符,但这不是标准库应该处理的问题。