以下是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)))?