表达式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;这两个断言都成功了,这表明两个表达式具有相同的类型。但是,typeid返回不同的结果:
FvvE
PFvvE为什么会这样呢?
发布于 2018-01-23 18:11:07
这两个断言都成功了,因为它们都应用于从函数参数推导出的类型T。在这两种情况下,它都将被推导为指向函数的指针,因为函数会衰减为指向函数的指针。但是,如果您重写断言以直接接受类型,那么第一个断言将失败:
static_assert(is_same<void(*)(), decltype(fun)>::value);
static_assert(is_same<void(*)(), decltype(&fun)>::value);发布于 2018-01-23 18:08:29
fun和&fun指的是同一类型,因为function to pointer conversion是在check<void(*)()>(fun);中执行的;但typeid是一个例外。
(强调我的)
不执行
左值到右值、数组到指针或函数到指针的转换。
以及为什么对check<void(*)()>(fun);执行函数到指针的转换,因为在template argument deduction中,
在扣除开始之前,对P和A进行以下调整:
1)如果P不是引用类型,
check()通过值获取参数,然后执行函数到指针的转换,推导出的T类型也将是函数指针,即void(*)()。
https://stackoverflow.com/questions/48398948
复制相似问题