Sto cercando di capire come funziona std::declval<T>()
. Io so come usarlo, e sapere cosa fa, consente principalmente di utilizzare decltype
senza costruire l'oggetto, comeCome funziona std :: declval <T>()?
decltype(std::declval<Foo>().some_func()) my_type; // no construction of Foo
So per cppreference.com che std::declval<Foo>
"aggiunge" un riferimento rvalue a Foo
, che a causa di le regole di compressione di riferimento diventano o un riferimento di rvalore o un riferimento di lvalue. La mia domanda è: perché il costruttore di Foo
non viene chiamato? Come si può implementare una versione "giocattolo" di std::declval<T>
senza costruire il parametro template?
PS: I know non è lo stesso del vecchio trucco
(*(T*)(nullptr))
Dalla stessa pagina: "Si noti che poiché non esiste alcuna definizione per declval, può essere utilizzato solo in contesti non valutati, è un errore valutare un'espressione che contiene questa funzione." –
@remyabel si, l'ho visto, non so come "costruire" il mio 'declval' – vsoftco
' template < class T > typename std :: add_rvalue_reference :: type declval(); 'letteralmente è tutto ciò che serve. [Esempio dal vivo] (http://coliru.stacked-crooked.com/a/9a8d4e5cfa60355f) –