declval用于非求值上下文中
declval 原形:
template<typename _Tp>
auto declval() noexcept -> decltype(__declval<_Tp>(0))
{
static_assert(__declval_protector<_Tp>::__stop,
"declval() must not be used!");
return __declval<_Tp>(0);
}
.....
template<typename _Tp>
struct __declval_protector
{
static const bool __stop = false;
};
....
template<typename _Tp, typename _Up = _Tp&&>
_Up
__declval(int);
template<typename _Tp>
_Tp
__declval(long);
用法1:求函数返回类型:
void commonF(int,double,char){};
template<class F,class... Args>//F:可调用对象 类型; Args:F的参数类型
using InvokeResultOfFunc =
decltype(declval<F>()(declval<Args>()...));
int main(){
//不仅可以用于普通函数, 还可用于函数对象的求返回类型
InvokeResultOfFunc<float (int), int> a{};//a为float类型
InvokeResultOfFunc<decltype(commonF), int,double,char> *b{};
}