Qui:
auto dv = Timer();
Hai un oggetto di tipo Timer
chiamato dv
che è essendo inizializzato da una copia temporanea (l'espressione sul lato destro del segno =
).
Quando si utilizza auto
per dichiarare una variabile, il tipo di tale variabile è uguale al tipo dell'espressione che lo inizializza, non considerando i qualificatori e i riferimenti cv qui.
Nel tuo caso, l'espressione che inizializza dv
ha tipo Timer
e così dv
ha tipo Timer
.
Qui:
int time_keeper(Timer());
si dichiara una funzione chiamata time_keeper
che restituisce un int
e prende come input un puntatorea una funzione che restituisce un Timer
e prende alcun argomento.
E perché non è l'argomento Timer (*)()
?
Funzioni decadimento ai puntatori quando passato come argomento, quindi il tipo di time_keeper
è effettivamente int(Timer(*)())
.
Per convincersi, si potrebbe provare la compilazione di questo piccolo programma:
#include <type_traits>
struct Timer { };
int main()
{
int time_keeper(Timer());
static_assert(
std::is_same<
decltype(time_keeper),
int(Timer(*)())
>::value,
"This should not fire!");
}
Ecco un live example.
fonte
2013-06-12 08:18:29
AFAIK la seconda riga richiama l'MVP, il primo no. –
Lo so, ma sono confuso con i tipi coinvolti nel codice –