tutaj:
auto dv = Timer();
masz obiekt typu Timer
nazywa dv
czyli inicjowane podczas kopii z tymczasowego (wyrażenie po prawej stronie znaku =
).
Podczas deklarowania zmiennej za pomocą auto
, typ tej zmiennej jest taki sam, jak typ wyrażenia, które ją inicjalizuje - nie biorąc pod uwagę tutaj kwalifikatorów i odniesień cv.
W twoim przypadku wyrażenie, które inicjuje dv
ma typ Timer
, a więc dv
ma typ Timer
.
tutaj:
int time_keeper(Timer());
zadeklarować funkcję o nazwie time_keeper
która zwraca int
i bierze za swoje wejście do wskaźnik do funkcji, która zwraca Timer
i nie bierze argument.
Dlaczego nie ma argumentu: Timer (*)()
?
Funkcje rozpad do wskaźników gdy przekazany jako argument, więc rodzaj time_keeper
jest rzeczywiście int(Timer(*)())
.
Aby przekonać się, można spróbować kompilacji ten mały program:
#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!");
}
Oto live example.
AFAIK, druga linia wywołuje MVP, pierwsza nie. –
Wiem o tym, ale jestem mylić z typami zaangażowanymi w kod –