Chr*_*s_F 3 c++ stl exception noexcept
根据cppreference的构造函数(2)std::span定义为
template< class It >
explicit(extent != std::dynamic_extent)
constexpr span( It first, size_type count );
Run Code Online (Sandbox Code Playgroud)
例外情况列为2) Throws nothing.
如果这个构造函数“什么都不抛出”,那么为什么它甚至被列在异常下,为什么构造函数没有标记为 noexcept?
Nel*_*eal 11
那是因为这个构造函数有先决条件。从标准来看:
\n\n\n\n
template<class It>
\nconstexpr explicit(extent != dynamic_extent) span(It first, size_type count);约束:令U为remove_\xc2\xadreference_\xc2\xadt<iter_\xc2\xadreference_\xc2\xadt>。
\n\n
\n- 它满足连续_\xc2\xaditerator。
\n- is_\xc2\xadconvertible_\xc2\xadv<U( )[], element_\xc2\xadtype( )[]> 为真。
\n
\n[注 1:目的是仅允许迭代器引用类型到 element_\xc2\xadtype 的限定转换。\n\xe2\x80\x94 尾注]前提条件:
\n\n
\n- [first,first + count) 是有效范围。
\n- 它模拟连续_\xc2\xaditerator。
\n- 如果范围不等于dynamic_\xc2\xadextent,则计数等于范围。
\n效果:用 to_\xc2\xadaddress(first) 初始化 data_\xc2\xad,用 count 初始化 size_\xc2\xad。
\n投掷:什么也没有。
\n
具有“不抛出任何内容”前提条件的函数不会被标记noexcept,因为如果不满足这些前提条件,可能会发生未定义的行为。例如,即使没有办法抛出,也没有std::vector::front标记,但在空向量上调用它是未定义的行为。noexcept
这是一篇关于它的论文:https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1656r1.html
\n