以下是value_or()
C++17 标准的定义:
template <class U> constexpr T value_or(U&& v) const&;
效果:相当于:
return bool(*this) ? **this : static_cast<T>(std::forward<U>(v));
备注:如果
is_copy_constructible_v<T> && is_convertible_v<U&&, T>
是false
,则程序格式错误。
(右值重载类似)
的效果value_or
被描述为等同于return bool(*this) ? **this : static_cast<T>(std::forward<U>(v));
operator bool
是noexcept
。operator*
不是(即使它没有抛出,可能是因为如果在可选项不包含值时使用它仍然会因 UB 失败)。 noexcept
但是,我们保证永远不会尝试返回包含的值,除非我们有一个。
所以不能value_or
声明noexcept
给定is_nothrow_copy_constructible<T> && noexcept(static_cast<T>(std::forward<U>(v)))
?