hier:
auto dv = Timer();
Sie haben ein Objekt vom Typ Timer
genannt dv
, die ist Copy-initialisiert von einem temporären (der Ausdruck auf der rechten Seite der =
Zeichen).
Wenn Sie verwenden, um eine Variable zu deklarieren, ist der Typ dieser Variablen der gleiche wie der Typ des Ausdrucks, der ihn initialisiert - ohne Berücksichtigung von CV-Qualifikationsmerkmalen und Verweisen hier.
In Ihrem Fall, dass der Ausdruck dv
initialisiert hat Timer
geben, und so hat dv
Timer
geben.
hier:
int time_keeper(Timer());
Sie deklarieren eine Funktion namens time_keeper
, die eine int
und nimmt als seine Eingabe liefert einen Zeiger auf eine Funktion, die eine Timer
zurückgibt und kein Argument.
Und warum ist nicht das Argument Timer (*)()
?
Funktionen Verfall Zeiger, wenn als Argument übergeben, so dass die Art der time_keeper
ist eigentlich int(Timer(*)())
.
überzeugen Sie sich selbst, Sie könnten versuchen, dieses kleine Programm kompiliert:
#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!");
}
hier ein live example ist.
AFAIK die zweite Zeile ruft den MVP auf, der erste nicht. –
Ich weiß das, aber ich bin verwirrt mit den Typen im Code –