2015-05-21 15 views
8

Ho iniziato a eseguire il porting di un vC++ 10/boost 1.48 codebase a vC++ 12/boost 1.57 e ricevo un errore che potenzia: :: facoltativo non può convertire in bool. Ho pensato che questa fosse una funzionalità di boost :: opzionale, è stata rimossa?boost: il cast implicito facoltativo di bool è scomparso?

Esempio:

bool fizz(){ 
    boost::optional<int32_t> buzz; 
    return buzz; 
} 

Error 21 error C2440: 'return' : cannot convert from 'boost::optional<int32_t>' to 'bool' 

risposta

10

Sì. Boost 1.55 ancora usato il Safe Bool Idiom:

// implicit conversion to "bool" 
// No-throw 
operator unspecified_bool_type() const { return this->safe_bool() ; } 

Boost 1.56, Boost 1.57 e Boost 1.58 ora utilizzare questa macro:

BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT() 

che è grosso modo:

#if !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS) 
    explicit operator bool() const noexcept; 
#else if !defined(BOOST_NO_UNSPECIFIED_BOOL) 
    operator boost::detail::unspecified_bool_type() const noexcept; 
#else 
    operator bool() const noexcept; 
#endif 

Sto indovinando non si dispone di BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS definito - e dal momento che il compilatore supporta operatori di conversione espliciti, si forse lo terremo così!

+0

L'implementazione della 1.58 non è cambiata. Usa ancora la macro. –

+0

@ T.C. Oops, corretto. – Barry

+0

Grazie per la risposta dettagliata. Lasciarmi conoscere la macro è molto utile dato che dobbiamo sostenere le vecchie cose per un altro semestre o giù di lì. – sellsword

Problemi correlati