Почему boost :: option <T>не конвертируется в bool для целей std :: is_convertible - PullRequest
0 голосов
/ 15 ноября 2018

у меня

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;

и необязательный явно конвертируется в логическое значение, потому что мы всегда используем его как

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

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

1 Ответ

0 голосов
/ 15 ноября 2018

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

Вам нужен std::is_constructible, который пытается выполнить явное преобразование.

следующие компиляции

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

и следующее не может быть скомпилировано, так как необязательный не конвертируется в int

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