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

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(使用前将#替换为@)

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

  • 如何以编程方式将访问键(快捷方式)添加到 WPF ContextMenu?

    我已经有以下内容 var myContextMenu new System Windows Controls ContextMenu var exitItem new MenuItem exitItem Header E xit exitI
  • 无法使用c#更改视频捕获分辨率

    我正在尝试使用 C 中的 DirectShowNet 更改默认网络摄像头分辨率 据我所知 我需要通过调用 windows win32 api dll 中内置的 VideoInfoHeader 类来更改它以进行 avi 捕获 我有来自 Dir
  • 如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core

    我正在尝试编写一个控制器 该控制器接收来自 AJAX 调用的请求并通过 DBContext 对数据库执行一些调用 但是 当我发出命令时var user await GetCurrentUserAsynch 在对 DBContext 的任何调
  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • C# 中 PKCS11Interop 库的线程安全使用 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 PKCS11Interop 在 HSM 内执行密钥管理操作 我使用的 HSM 是 Thales PCI Express 下面是
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何在 Visual Basic DLL 和 C++ DLL 之间创建隔离/免注册 COM?

    我必须在 C DLL 中使用 VB COM DLL 我弄清楚了如何从 C DLL 访问 VB COM DLL 并且它可以工作 现在我遇到了一个问题 我必须使用隔离的 COM 免注册 COM 因为我无法在必须使用它的每台 PC 上注册 DLL
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • asp.net core http 如果没有内容类型标头,则删除 `FromBody` 忽略

    我在 http 中使用 bodyDELETE要求 我知道目前删除主体是非标准的 但是允许的 使用时出现问题HttpClient它不允许删除请求的正文 我知道我可以使用SendAsync 但我宁愿让我的 API 更加灵活 我希望这个机构是可选
  • Windows 上本机 C++ 应用程序中的自动死代码检测?

    背景 我有一个用原生 C 编写的应用程序 花了几年的时间 大约有 60 KLOC 有很多函数和类已经死了 可能有 10 15 就像下面提出的类似的基于 Unix 的问题 我们最近开始对所有新代码进行单元测试 并尽可能将其应用于修改后的代码
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 展开 std::reference_wrapper 的成本

    Given include
  • 如何根据当前日期时间发现财政年度?

    我需要基于当前或今天的日期时间的财政年度 假设我们认为今天的日期是10 April 2011 那么我需要输出为Financial Year 2012在某些情况下 我需要以短格式显示相同的输出FY12 我想以两种方式显示 在我们的要求中 考虑

随机推荐

  • 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 确定各个参数的类型后 任