【发布时间】:2018-10-14 04:24:06
【问题描述】:
这是 C++17 标准中value_or() 的定义:
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* 是 not noexcept (即使它没有抛出,可能是因为如果在可选项不包含值时使用它仍然会因 UB 失败)。但是,我们保证永远不会尝试返回包含的值,除非我们有一个。
那么在给定is_nothrow_copy_constructible<T> && noexcept(static_cast<T>(std::forward<U>(v))) 的情况下,不能将value_or 声明为noexcept 吗?
【问题讨论】:
-
C++ 标准中没有大量使用条件 noexcept 可能会“算”为阻止它在这里使用的东西。
-
@Yakk 我认为这回答了提出的问题,但另一个问题立即出现:为什么它没有被广泛使用?
标签: c++ language-lawyer c++17 noexcept stdoptional