Я читаю этот вопрос по часто задаваемому вопросу isocpp, этот вопрос объясняет, как написать возвращаемый тип для ???
template<class T, class U>
??? mul(T x, U y)
{
return x*y;
}
Я понимаю, что простой способ - написать auto mul(T x, U y) -> decltype(x*y)
, однако вопрос также дает другой путь, который заключается в замене ???
на decltype(*(T*)(0)**(U*)(0))
. Но я не совсем понимаю, что действительно делает этот decltype(*(T*)(0)**(U*)(0))
, кажется, что он объявляет временный указатель T*
и инициализирует его нулем, а затем разыгрывает указатель, а затем умножается на тот же экземпляр для типа U
, правильно ли я понимаю?
Но зачем использовать указатели? Я думаю, что decltype(T(0)*U(0))
или decltype(T{0}*U{0})
также должны работать.