Considerare:Nullptr in operatore ternario
struct A { bool operator==(const A& that) { return true; } };
boost::optional<A&> f()
{
std::vector<A> vec;
auto it = std::find(vec.begin(), vec.end(), A());
// Version A
return (it == vec.end() ? nullptr : *it);
// Version B
if (it == vec.end()) {
return nullptr;
} else {
return *it;
}
}
Perché versione A si compila (errore C2446: ':': nessuna conversione da 'A' a 'nullptr') mentre la versione B fa?
(so che posso fare per esempio
return (it == vec.end() ? boost::optional<A&>() : *it);
, la mia domanda è: perché è la costruzione da nullptr apparentemente trattato diversamente da con l'operatore ternario?)
Solo testato su msvc12 (= visiva Studio 2013).
In realtà [nessuno dei 'boost :: opzionale'] (http://www.boost.org/doc/libs/1_59_0/libs/optional/doc/html/optional/reference/header__boost_optional_optional_hpp_.html#boost_optional. reference.header__boost_optional_optional_hpp_.header_optional_optional) i costruttori prendono un 'nullptr', provano con' none_t'. –
Lo so, eppure la mia 'versione B' compila - la mia domanda è: perché? – Roel
Anche quando si arriva a "lavoro", non funziona. Restituzione di un riferimento (possibile) a una voce in un array locale? Non funzionerà molto bene davvero. Inoltre, un riferimento a un oggetto non puntatore non può mai essere un puntatore nullo. –