std::span 构造函数是否缺少 noexcept?

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

template<class It>
\n constexpr explicit(extent != dynamic_extent) span(It first, size_type count);

\n

约束:令U为remove_\xc2\xadreference_\xc2\xadt<iter_\xc2\xadreference_\xc2\xadt>。

\n
    \n
  • 它满足连续_\xc2\xaditerator。
  • \n
  • is_\xc2\xadconvertible_\xc2\xadv<U( )[], element_\xc2\xadtype( )[]> 为真。
    \n[注 1:目的是仅允许迭代器引用类型到 element_\xc2\xadtype 的限定转换。\n\xe2\x80\x94 尾注]
  • \n
\n

前提条件:

\n
    \n
  • [first,first + count) 是有效范围。
  • \n
  • 它模拟连续_\xc2\xaditerator。
  • \n
  • 如果范围不等于dynamic_\xc2\xadextent,则计数等于范围。
  • \n
\n

效果:用 to_\xc2\xadaddress(first) 初始化 data_\xc2\xad,用 count 初始化 size_\xc2\xad。

\n

投掷:什么也没有。

\n
\n

具有“不抛出任何内容”前提条件的函数不会被标记noexcept,因为如果不满足这些前提条件,可能会发生未定义的行为。例如,即使没有办法抛出,也没有std::vector::front标记,但在空向量上调用它是未定义的行为。noexcept

\n

这是一篇关于它的论文:https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1656r1.html

\n