函数到函数指针的“衰减”

2024-01-09

我们知道一个参数看起来像void()将被重写为void(*)()。这类似于数组到指针的衰减,其中int[]变成int*。在很多情况下,使用数组会将其衰减为指针。除了参数之外,是否存在函数“衰减”的情况?

C++ 标准规定:

§8.3.5/5

... 确定各个参数的类型后,任意一个参数 类型“T 的数组”或“返回 T 的函数”调整为“指针 分别为“T”或“指向返回 T 的函数的指针”...

由于下面的评论者似乎不相信我......这是我的编译器显示的内容。

void handler(void func())
{
    func(42);
}

main.cpp: In function 'void handler(void (*)())':
main.cpp:5:12: error: too many arguments to function
     func(42);
        ^

有三种转换被视为左值转换:左值到右值、数组到指针和函数到指针。你可以称之为“衰变”,因为这就是std::decay将对这些类型进行处理,但标准只是将其称为函数到指针的转换 [conv.func]:

函数类型的左值T可以转换为“指向的指针”类型的纯右值T”。结果是指向该函数的指针。

如果您询问发生函数到指针转换时的情况,它们基本上与发生其他两个左值转换时相同。如果我们只是按顺序浏览标准,以下是发生函数到指针转换的情况的详尽列表:

使用函数作为操作数,[expr]/9:

每当左值表达式作为需要该操作数纯右值的运算符的操作数出现时, 应用左值到右值 (4.1)、数组到指针 (4.2) 或函数到指针 (4.3) 标准转换 将表达式转换为纯右值。

使用函数作为可变参数函数的参数,[expr.call]/7:

当给定参数没有参数时,参数的传递方式使得接收函数可以通过调用来获取参数的值va_arg(18.10)... 左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 标准转换是对参数表达式执行的。

You can static_cast去掉这个转换,[expr.static.cast]/7:

不包含左值到右值 (4.1)、数组到- 的任何标准转换序列(第 4 条)的逆 指针 (4.2)、函数到指针 (4.3)、空指针 (4.10)、空成员指针 (4.11) 或布尔值 (4.12) 转换,可以使用显式执行static_cast.

尽管如此,您传入的操作数将被转换,[expr.static.cast]/8:

左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 转换应用于 操作数。

Using reinterpret_cast, [expr.reinterpret.cast]/1:

表达式的结果reinterpret_cast<T>(v)是表达式转换的结果v输入T. If T是左值引用类型或函数类型的右值引用,结果是左值;如果T是一个 对象类型的右值引用,结果是 xvalue;否则,结果是右值和左值-前值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 标准转换是在 表达v.

Using const_cast,[expr.const.cast],与上面的措辞基本相同。使用条件运算符 [expr.cond]:

执行左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 标准转换 在第二个和第三个操作数上。

请注意,在上述所有情况下,它总是all左值变换。

在模板中也会发生函数到指针的转换。将函数作为非类型参数传递,[temp.arg.nontype]/5.4:

对于非类型模板参数类型指针到函数,函数到指针的转换(4.3) 被申请;被应用

或者输入推导,[temp.deduct.call]/2:

If P不是引用类型:

  • — If A是数组类型,则数组到指针标准转换 (4.2) 生成的指针类型为 用于代替A用于类型推导;否则,
  • — If A是函数类型,由函数到指针标准转换产生的指针类型(4.3) 用于代替A用于类型推导;否则,

或者转换函数模板推导,写法大致相同。

最后,当然,std::decay本身,在 [meta.trans.other] 中定义,强调我的:

Let U be remove_reference_t<T>. If is_array<U>::value是真的,则 成员 typedef 类型应等于remove_extent_t<U>*. If is_function<U>::value为 true 时,成员 typedef 类型应等于add_pointer_t<U>。否则成员 typedef 类型等于remove_cv_t<U>。 [ 注意:此行为类似于 当左值表达式用作右值时应用左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 转换,但也会剥离cv-来自类类型的限定符,以便更紧密地按值建模 论证传递。 ——尾注]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数到函数指针的“衰减” 的相关文章

随机推荐

  • GSM SM5100B C M E E R R O R:4 错误

    我正在使用 Arduino 来控制 SM5100B GSM 设备 除了当我想在收到另一条短信后发送短信时 一切正常 我明白了 错误代码 确定 gt C M G S 2 5 确定 C M E E R O R 4 我处理上述收到的短信的代码 i
  • grpc:调用是半关闭错误

    我正在使用 Google Cloud Platform Speech API 我正在使用示例源进行开发 https github com GoogleCloudPlatform android docs samples tree maste
  • 在表单提交事件上打开 URL - Google 应用程序脚本

    我正在使用 Serge insas 提供的示例代码 用于打开 URL 的 Google Apps 脚本 https stackoverflow com questions 10744760 google apps script to ope
  • 将 List> 转换为 IList>

    我写了一个方法是public List
  • 用于创建格式化 XLSX 电子表格的 JS 库

    我目前正在使用 JS 创建通用电子表格https www npmjs com package xlsx https www npmjs com package xlsx 这可以很好地生成一个通用电子表格来显示我的数据 但是 我想添加一些功能
  • 将 PST 格式的日期和时间转换为 UTC 格式

    我有一个变量 str 字符串类型 其值为 28 Nov 2013 09 15 AM 如何将其转换为 UTC 格式 str 变量中的上述时间采用 PST 因此 UTC 应该是 8超过这个时间 我正在使用 flex 2 下面发现以下代码不起作用
  • 居中浮动 DIV

    我正在尝试将 3 个浮动 DIV 居中 如果我给父级 DIV 就可以了显示 表格 和子 DIV显示 单元格 它将像一张桌子一样工作 还有别的办法吗
  • AttributeError:“模块”对象没有属性“utcnow”

    当我输入简单的代码时 import datetime datetime utcnow 我收到错误消息 Traceback most recent call last File
  • webpack 构建后运行命令

    我想运行 webpack watch模式 并在每次构建后运行 shell 命令 将一个文件夹同步到另一个文件夹 I found 这个插件 https www npmjs com package on build webpack每次构建后都会
  • 防止休眠 StaleObjectStateException 发生

    我对 Spring 控制器方法有疑问 它实际上对同一实体进行了两次更新 这导致陈旧对象状态异常 问题是 当我检索 Member 实例时 我认为它会以某种方式导致更新 请参阅 UPDATE ONE 的广告实例 这实际上是不需要的 以及当我更新
  • 替换 SQL 中字符串中第一次出现的子字符串

    我必须从 temp 表中获取数据 其中包含 或 ccc 或 bbb 或 aaa 之类的内容 我想将第一次出现的内容替换为空间以获得类似 ccc 或 bbb 或 aaa 之类的内容 我正在尝试一些东西并替换 但它们似乎没有给我带来想要的结果
  • Django 中“max_length”的最大大小是多少?

    这是我的模型 class Position models Model map models ForeignKey Map primary key True members models CharField max length 200 La
  • urllib2 和 json

    谁能指出一个教程 向我展示如何使用 urllib2 执行 POST 请求 数据为 JSON 格式 仅当服务器不费心检查内容类型标头时 梅萨的答案才有效 如果您希望它真正起作用 您需要指定一个内容类型标头 这是经过修改以包含内容类型标头的 M
  • Google Tasks API BatchRequest 触发“批量请求中的重复请求 ID”

    从 9 月 13 日开始 Google Tasks BatchRequest 更新工作流程将在多年来保持稳定的应用程序中触发 400 错误返回 批量请求中的重复请求 ID 我在请求中找不到任何指示重复请求 ID 的内容 有人知道怎么回事吗
  • 更改表格的 CCK 标题

    默认情况下 CCK 表单创建具有表单标题 Create Your Content Type Name Here 我想把我的改成 Register for Such and Such 有人建议我可以使用字符串覆盖 但我找不到要替换的字符串 我
  • 带有响应图像的 2 列 CSS 响应式布局

    我已经浏览了尽可能多的关于这个主题的帖子 但没有一个能解决这个难题 是否可以让左列包含文本 右列包含图像 调整大小时 图像会流入单个列 并带有自动调整大小的图像 在 img 上使用 100 的最大宽度将使图像响应并自动调整大小 但是 自动调
  • 如何使无窗口/命令行应用程序返回但继续在后台执行?

    我正在 Net 中编写一个命令行应用程序 该应用程序本身相当简单 但它必须同步连接到 Web 服务 而 Web 服务又必须连接到 Oracle 数据库 并且those作品喜欢慢慢来 是否有一种简单的方法 无需将我的应用程序 exe 一分为二
  • PHP、mysql编码UTF-8

    我正在进行基本的 PHP 和 MySQL 搜索 我国通常使用的字符编码是 utf 8 或 euc kr 当我输入英文关键字时 结果显示良好 但是 输入韩语关键字 结果不会显示在屏幕上 未显示结果计数 我正在 Eclipse PDT 上编码
  • Python 中无法连接字符串和整数的原因[重复]

    这个问题在这里已经有答案了 大量文献记载了这一点str需要先将整数转换为字符串 然后才能连接它们 I am str n years old Python不允许一定有根本原因 I am n years old 我想知道原因是什么 在我的项目中
  • 函数到函数指针的“衰减”

    我们知道一个参数看起来像void 将被重写为void 这类似于数组到指针的衰减 其中int 变成int 在很多情况下 使用数组会将其衰减为指针 除了参数之外 是否存在函数 衰减 的情况 C 标准规定 8 3 5 5 确定各个参数的类型后 任