我在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))
相当于仅当T
和U
具有构造以单一int
(或东西可以从一个整数文字隐式转换成).
标准库已经std::declval
以更清洁的方式实现了这一目标:
decltype(std::declval<T>() * std::declval<U>())
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
719 次 |
最近记录: |