Здесь:
auto dv = Timer();
У вас есть объект типа Timer
, называемый dv
, который копируется из временного (выражение справа от знака =
).
При использовании auto
для объявления переменной тип этой переменной совпадает с типом выражения, которое ее инициализирует, не рассматривая здесь cv-квалификаторы и ссылки.
В вашем случае выражение, которое инициализирует dv
, имеет тип Timer
, и поэтому dv
имеет тип Timer
.
Здесь:
int time_keeper(Timer());
]
Вы объявляете функцию с именем time_keeper
, которая возвращает int
и принимает в качестве своего входного указателя функцию, которая возвращает Timer
и не принимает аргументов.
И почему не аргумент
blockquote>Timer (*) ()
?Функции распадаются на указатели при передаче в качестве аргумента, поэтому тип
time_keeper
на самом делеint(Timer(*)())
,Чтобы убедить себя, вы можете попробовать составить эту небольшую программу:
#include
struct Timer { }; int main() { int time_keeper(Timer()); static_assert( std::is_same< decltype(time_keeper), int(Timer(*)()) >::value, "This should not fire!"); }