首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"fun“和"&fun”的类型不同?

"fun“和"&fun”的类型不同?
EN

Stack Overflow用户
提问于 2018-01-23 18:04:20
回答 2查看 3.4K关注 0票数 32

表达式fun&fun是否具有相同的类型?

考虑以下代码:

代码语言:javascript
复制
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返回不同的结果:

代码语言:javascript
复制
FvvE
PFvvE

为什么会这样呢?

EN

回答 2

Stack Overflow用户

发布于 2018-01-23 18:11:07

这两个断言都成功了,因为它们都应用于从函数参数推导出的类型T。在这两种情况下,它都将被推导为指向函数的指针,因为函数会衰减为指向函数的指针。但是,如果您重写断言以直接接受类型,那么第一个断言将失败:

代码语言:javascript
复制
static_assert(is_same<void(*)(), decltype(fun)>::value);
static_assert(is_same<void(*)(), decltype(&fun)>::value);

online compiler

票数 29
EN

Stack Overflow用户

发布于 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不是引用类型,

  • 如果A是数组类型,...;
  • 否则,如果A是函数类型,则A将替换为从函数到指针转换获得的指针类型;

check()通过值获取参数,然后执行函数到指针的转换,推导出的T类型也将是函数指针,即void(*)()

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48398948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档