std::span构造函数未标记noexcept?标注不抛异常却仍列于异常列表
关于std::span构造函数(2)的异常说明疑问解答
先看cppreference给出的构造函数(2)声明:
template< class It > explicit(extent != std::dynamic_extent) constexpr span( It first, size_type count );
它的异常说明标注为“Throws nothing”,却没有标记noexcept,还特意在异常列表里单独列出,原因主要有这几点:
noexcept的条件性限制:这个构造函数的模板参数
It是符合要求的连续迭代器(contiguous iterator)。对于原生指针这类内置迭代器,所有相关操作都是noexcept的,但如果是用户自定义的连续迭代器,其转换为原始指针的操作(比如std::to_address)可能不具备noexcept属性。C++标准不能给这个构造函数加无条件的noexcept,否则会限制合法的自定义迭代器使用场景。“Throws nothing”是语义承诺:这个说明是在明确该构造函数的行为语义——只要满足前置条件(比如迭代器指向的范围合法、属于连续迭代器),构造过程本身不会主动抛出任何异常。这是对用户使用时的异常安全承诺,和语法层面的
noexcept标记属于两个维度的概念。单独列出是为了明确性:在异常说明里特意标注,是为了和其他可能抛出异常的span构造函数区分开,让用户清晰知道这个构造函数的异常安全等级,避免混淆。
内容的提问来源于stack exchange,提问作者Chris_F
相关产品推荐
相关产品推荐

