这个语法"decltype(*(T*)(0)**(U*)(0))"是什么意思?

All*_*nzi 15 c++ c++11

在isocpp FAQ上阅读这个问题,这个问题是解释如何编写返回类型???

template<class T, class U>
??? mul(T x, U y)
{
return x*y;
}
Run Code Online (Sandbox Code Playgroud)

我理解简单的方法是写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})应该也有效.

Tar*_*ama 21

decltype(*(T*)(0)**(U*)(0))
Run Code Online (Sandbox Code Playgroud)

让我们分开吧:

(T*)(0) //cast a null pointer to a T*
*(T*)(0) //dereference, giving a T

(U*)(0) //cast a null pointer to a U*
*(U*)(0) //dereference, giving a U

(*(T*)(0)) * (*(U*)(0)) //the result of multiplying a U and a T
Run Code Online (Sandbox Code Playgroud)

decltype(T(0)*U(0))相当于仅当TU具有构造以单一int(或东西可以从一个整数文字隐式转换成).

标准库已经std::declval以更清洁的方式实现了这一目标:

decltype(std::declval<T>() * std::declval<U>())
Run Code Online (Sandbox Code Playgroud)