У меня есть

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; 
    }
}

Что мне здесь не хватает?

4
bradgonesurfing 15 Ноя 2018 в 15:11

1 ответ

Лучший ответ

boost::optional operator bool - это explicit. Он работает внутри условия if, потому что это контекстное преобразование.

Вам нужен 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" );
10
bradgonesurfing 15 Ноя 2018 в 12:31