Sto leggendo this question on isocpp FAQ here, questa domanda sta spiegando come scrivere il tipo di ritorno per ???
Che cosa significa questa sintassi "decltype (* (T *) (0) ** (U *) (0))" significa?
template<class T, class U>
??? mul(T x, U y)
{
return x*y;
}
ho capito il modo più semplice è quello di scrivere auto mul(T x, U y) -> decltype(x*y)
, tuttavia la domanda dà anche un altro modo, che è quello di sostituire ???
da decltype(*(T*)(0)**(U*)(0))
. Ma non capisco perfettamente cosa stia realmente facendo questo decltype(*(T*)(0)**(U*)(0))
, sembra che stia dichiarando un puntatore temporaneo T*
e inizializzarlo a zero e quindi dereferenziare il puntatore, quindi moltiplicato per la stessa controparte per il tipo U
, la mia comprensione è giusta?
Ma perché utilizzare i puntatori? Penso che anche decltype(T(0)*U(0))
o decltype(T{0}*U{0})
dovrebbero funzionare. spaccatura
Ciò presuppone che 'T 'e' U' hanno un costruttore che prende un singolo parametro intero. Il modo puntatore non fa supposizioni sui costruttori di 'T' e' U'. –
Nota, non è un comportamento indefinito poiché è [in un contesto non valutato] (http://stackoverflow.com/a/28723577/1708801) –