为什么 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::optional
的 operator bool
是 explicit
。它在 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" );
我有
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::optional
的 operator bool
是 explicit
。它在 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" );