2015-02-16 12 views
18

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)) 
+0

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." –

+0

@remyabel si, l'ho visto, non so come "costruire" il mio 'declval' – vsoftco

+0

' 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) –

risposta

12

In sostanza, in un sizeof o decltype espressione è possibile richiamare le funzioni che non sono implementate ovunque (che devono essere dichiarati, non implementata).

E.g.

class Silly { private: Silly(Silly const&) = delete; }; 

auto foo() -> Silly&&; 

auto main() -> int 
{ 
    sizeof(foo()); 
} 

Il linker non dovrebbe lamentarsi di questo.

+0

Ah, ok, ora ha senso perché "aggiungere un riferimento di rvalue" fa il trucco. Per qualche motivo non sapevo che puoi usare 'decltype' solo sulle funzioni dichiarate. L'unica cosa per cui sono ancora un po 'perplesso è perché puoi chiamare '.f()' in 'declval () .f()', avrei pensato che avevi bisogno di qualcosa come 'declval () :: f () ' – vsoftco

+2

@vsoft in un contesto non valutato, tutto ciò che conta sono i tipi. Non hai bisogno dell'istanza per usare l'istanza: devi solo fingere. Dopo tutto, il suono di una mano che cade nella foresta se ci sono due tracce di trolly? – Yakk

Problemi correlati