Ho finalmente iniziato a leggere su c++11 e non riesco a capire perché sono richiesti i tipi di ritorno trailing.Perché è stata necessaria l'aggiunta di trailing-return-types in C++ 11?
mi sono imbattuto nel seguente esempio, che viene utilizzato per evidenziare il problema:
template<class Lhs, class Rhs>
decltype(lhs+rhs) adding_func(const Lhs &lhs, const Rhs &rhs) {return lhs + rhs;}
L'esempio è illegale, perché decltype(lhs+rhs)
non funziona, dal momento che gli identificatori lhs
e rhs
sono valide solo dopo la fase di parsing .
Suppongo che la mia domanda riguardi la tempistica della risoluzione di tipo decltype
. Se non sbaglio, la parola chiave decltype
viene utilizzata per determinare il tipo di un'espressione in fase di compilazione.
Non riesco a vedere uno svantaggio di avere decltype
eseguire la risoluzione del tipo dopo il completamento di tutte le analisi (che funzionerebbe correttamente per l'esempio precedente). Credo che questo sarebbe stato un modo più semplice per risolvere il problema ...
invece, lo standard C++ 11 fornisce trailing-return-tipo:
template<class Lhs, class Rhs>
auto adding_func(const Lhs &lhs, const Rhs &rhs) -> decltype(lhs+rhs) {return lhs + rhs;}
Non ho alcun dubbio che mi manca qualcosa, dal momento che non riesco a vedere l'altro uso di tipi di ritorno finali. Dov'è il difetto nel mio ragionamento?
I tipi di trailing-return mi sembrano una soluzione eccessivamente complessa poiché la risoluzione del tipo decltype
dopo l'analisi del corpo della funzione completa funzionerebbe altrettanto bene?
Grazie per la tua eccellente risposta, ora vedo gli usi. Vorrei poter dare un cookie in più per il riferimento C++ 14! –
Sulla cosa C++ 14: è definitivo che verrà incluso? Sembra un mondo di dolore in termini di documentazione ... – MFH
@MFH: è nel [C++ 14 Community Draft] (http://isocpp.org/blog/2013/05/new-paper-n3690-programming- lingue-c-comitato-progetto). Quindi, escludendo conseguenze impreviste, probabilmente sarà in C++ 14. E sì, potrebbe essere un po 'doloroso per la documentazione. Ma di nuovo, vuol dire che non hai ridondanza senza senso come usare 'decltype' per dedurre il tipo che corrisponde esattamente al codice * nella funzione *. –