如何显式调用其 conversion-type-id 包含占位符说明符的转换函数

2024-04-28

struct A{
  operator auto(){
     return 0;
  }
};
int main(){
   A a;
   a.operator auto(); // #1
   a.operator int(); //  #2
}

GCC https://godbolt.org/z/3jdaK9接受 #2 是显式调用转换函数的正确方法,同时Clang https://godbolt.org/z/Ehf5vG接受#1。

看起来#1由于以下规则,格式不正确:
dcl.spec.auto#6 https://timsong-cpp.github.io/cppwp/n4659/dcl.spec.auto#6

在本节未明确允许的上下文中使用 auto 或 decltype(auto) 的程序是格式错误的。

这个用法a.operator auto()[dcl.spec.auto] 节中未明确允许,因此它应该是格式错误的。然而,对于GCC接受的第二种用法,标准并没有说conversion-function-id哪里的conversion-type-id is 替换为推导类型表示转换函数的名称。换句话说,所声明的conversion-function-id声明中是operator auto而不是operator int。前者与声明的 declarator-id 具有相同的标记。根据语法,unqualified-idoperator auto应该是该转换函数的名称。那么,如何显式调用这个转换函数呢?当转换函数包含占位符说明符时,标准中是否未指定转换函数的名称?


看来,这个规定还不够准确。

  1. From 10.1.7.4 The auto specifier:

占位符类型可以与函数声明符一起出现在 decl-说明符-seq、类型说明符-seq、转换函数 ID, 或者 尾随返回类型,在此类声明符有效的任何上下文中。

准确地阅读,人们可能会在这里区分“可以”和更强的“只能”,即可能为编译器内在函数的自由度开辟空间(完全错误与未指定的行为)。

And 3.4.5 class member access says:

7 如果 id-expression 是一个 conversion-function-id,则其 首先在对象的类中查找 conversion-type-id 表达式和名称(如果找到)将被使用。

如果 auto 关键字在该上下文中是否可以有效地成为完全限定的转换类型 ID,那么再次留有解释的空间。

你的问题本身可能需要进一步分支,即

  1. 运算符 auto() 使用的详细重载规则是什么,即它是否应该可用于已经在类定义级别上的常规候选人竞争? (Clang 和 Gcc 则不然,除了额外的运算符 int() ...之外,它们都先验地接受运算符 ...)
  2. 是否可以使用显式成员运算符引用(您的情况1)来调用运算符 auto() ,即有效地,它是否有一个(唯一的)可访问名称?允许这样做将与该关键字的所有其他明确允许的用例相矛盾。

我已经在几个 clang 修订版中看到了对此的显式测试,因此它的行为不是隐式命名约定应用程序的产物,而是显然是明确期望的行为。

正如评论中已经提到的,至少与 gcc 相比,Clang 的行为在整体上更加一致,因为它完全清楚,其中 auto 关键字用于类型推导,以及名称/函数 ID 解析。那里的运算符 auto() 被作为一个更显式的自己的实体来处理,而对于 gcc,它具有类似于 lambda 的匿名字符,但即使对于显式成员运算符访问方式,它也会参与候选人竞争。

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

如何显式调用其 conversion-type-id 包含占位符说明符的转换函数 的相关文章

随机推荐

  • Webpack 和外部库

    我正在尝试 webpack http webpack github io http webpack github io 看起来真的很不错 但我有点被困在这里了 假设我正在为库 f ex jQuery 使用 CDN 然后在我的代码中 我想要r
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 挂载 vue 组件 - Vue 3

    我想在 Vue 3 中这样做 new ComponentName propsData title hello world mount 但我收到这个错误 VueComponents component name WEBPACK IMPORTE
  • Azure 表存储和缓存

    是否值得使用 Azure 缓存预览版从 Azure 表存储缓存数据 或者在大型应用程序中表存储是否足够快 Thanks 简短的答案是这取决于 在我当前正在开发的应用程序中 我们使用缓存来处理一些信息来处理从表存储检索数据的延迟并适应每秒所需
  • 为数据提供有效类型是否会产生副作用?

    假设我有一大块动态分配的数据 void allocate size t n void foo malloc n return foo 我希望使用指向的数据foo作为一种特殊类型 type t 但我想稍后再这样做 而不是在分配期间这样做 为了
  • Android Studio:通过命令行安装Release App

    我想从命令行导出 apk 文件 release apk 当我运行这个命令时 gradlew installRelease 我发现了这个 在根项目 中找不到 Android Studio 任务 安装版本 一些候选者是 卸载版本 我该如何解决
  • 如何在 Windows 8 上注册自定义 Win+V 热键?

    可以在 Windows 8 之前的 Windows 版本上注册 Win V 热键 使用此组合的示例应用程序是PureText http www stevemiller net puretext 在 Windows 8 Release Pre
  • IFrame Resizer 未调整大小

    我正在这个页面上工作 http factor1hosting com dnaz wordpress certifications http factor1hosting com dnaz wordpress certifications 我
  • Android 上可靠的重复后台任务

    我正在尝试运行一个后台任务 该任务每分钟左右运行一次 Android 应用程序 但我正在努力确保该任务实际上每分钟运行一次 我尝试了从使用 SystemClock sleep 到 AlarmManager 重复闹钟和固定闹钟 的各种方法 但
  • 尝试返回 IQueryable 时发生转换错误

    我有一个查询应该返回IQueryable
  • Typescript 中的顶级等待和导入

    我正在研究 Typescript 并遇到问题 我想使用import和顶级await但目前 我一次只能使用一个 这是我的配置tsconfig json这允许我使用导入 target ESNext module ESNext 这个允许我使用顶级
  • 如何解析 XML diff 以仅显示差异

    我使用以下方法比较两个序列化对象的 xmlMS XmlDiffPatch 工具 http msdn microsoft com en us library aa302294 aspx C XML 示例 1
  • MS Access 2003 - 有没有一种方法可以以编程方式定义图表的数据?

    因此 我有一些 VBA 用于获取使用表单的图表向导构建的图表 并自动将其插入到 PowerPoint 演示文稿幻灯片中 我将这些图表表单用作较大表单中的子表单 该表单具有用户可以选择的参数来确定图表上的内容 这个想法是 用户可以确定参数 根
  • FluentNHibernate:AsSet()的作用是什么?

    在 Fluent Nhibernate 中 对 HasMany 或 HasManyToMany 关系指定 AsSet 有何影响 假设映射属性的类型是 Iesi Set 以下之间有什么区别 HasMany x gt x MySetProper
  • 按某些字段排序的迭代学说集合

    我需要这样的东西 products Products getTable gt find 274 foreach products gt Categories gt orderBy title as category echo categor
  • Angular.js ng-switch ---测试值是否为空或未定义

    在 Angular js 模板中 我需要测试值是否未定义或为空 我不知道如何执行此操作 因为ng switch when测试字符串中的表达式 我需要使用ng switch因为这是一个 if else 条件 有任何想法吗 div div h1
  • 如何搭建Windows Phone开发环境并使用F#开发应用程序?

    我已经下载了Windows Phone开发工具 但我不知道如何使用F 来开发应用程序 目前是C 将 F 和 Windows Phone 模板安装到 Visual Studio 中可以让生活变得更轻松 如果您打开 Visual Studio
  • 如何在pdf中导出一对一的JTable[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 JTable 标题没有出现在图像中 https stackoverflow com questions 7369814 why does the jtable header not appea
  • 使用Gnuplot时,如何在行标题中打印行的方程?

    我使用 Gnuplot 绘制数据以及线性回归线 目前 该行的 标题 其方程由 Gnuplot 计算 只是 f x 但是 我希望标题是回归线的方程 例如 y mx c 我可以通过从绘图信息输出中读取 m 和 c 来手动执行此操作 然后使用新标
  • 如何显式调用其 conversion-type-id 包含占位符说明符的转换函数

    struct A operator auto return 0 int main A a a operator auto 1 a operator int 2 GCC https godbolt org z 3jdaK9接受 2 是显式调用