为什么 boost::optional<T> 不能转换为 bool 用于 std::is_convertible

Why is boost::optional<T> not convertable to bool for the purposes of std::is_convertible

我有

auto result = std::is_convertible
    < boost::optional<int>
    , bool
    >::value;

static_assert( result , "task should return bool" );

编译失败。 std::is_convertible 的定义是

template< class From, class To > struct is_convertible;

并且 optional 显然可以转换为布尔值,因为我们总是像

那样使用它
void(boost::optional<int> const & value){
    if(value){
        std::cerr << *value << endl; 
    }
}

我在这里错过了什么?

boost::optionaloperator boolexplicit。它在 if 的条件下工作,因为它是 contextual conversion.

您需要 std::is_constructible,它会尝试执行显式转换。

以下编译

static_assert
    ( std::is_constructible<bool, boost::optional<int>>::value
    , "msg" );

以下编译失败,因为 optional 不能转换为 int

static_assert
    ( std::is_constructible<int, boost::optional<int>>::value
    , "msg" );