NPS*_*NPS 30 c++ types function-pointers language-lawyer
表达式fun
和&fun
类型是否相同?
请考虑以下代码:
template <typename Check, typename T>
void check(T)
{
static_assert(is_same<Check, T>::value);
}
void fun()
{}
check<void(*)()>(fun);
check<void(*)()>(&fun);
cout << typeid(fun).name() << endl;
cout << typeid(&fun).name() << endl;
Run Code Online (Sandbox Code Playgroud)
两个断言都成功,这表明两个表达式都具有相同的类型.然而,typeid
s返回不同的结果:
FvvE
PFvvE
Run Code Online (Sandbox Code Playgroud)
这是为什么?
use*_*670 28
两个断言都成功,因为它们适用于T
从函数参数推导出的类型.在这两种情况下,它都将被推断为函数的指针,因为函数会衰减为指向函数的指针.但是,如果您重写断言以直接接受类型,那么第一个将失败:
static_assert(is_same<void(*)(), decltype(fun)>::value);
static_assert(is_same<void(*)(), decltype(&fun)>::value);
Run Code Online (Sandbox Code Playgroud)