使用 auto 的模板函数重载解析

2024-01-03

具有以下 3 个重载

template <class T> auto foo() { return 1; }
template <class T> int  foo() { return 2; }
template <class T> T    foo() { return 3; }

以下内容格式错误吗?

static_cast<int(*)()>(&foo<int>)();

Clang 选择重载#2,而 gcc 无法编译(Demo http://coliru.stacked-crooked.com/a/f805467081c1c419)

当删除过载 #1 时,双方都同意选择过载 #2 (Demo http://coliru.stacked-crooked.com/a/82de6eb2336a5282).

当删除重载 #2 时,gcc 选择重载 #1 并且 clang 无法编译(Demo http://coliru.stacked-crooked.com/a/28428c56e6e77756)


As per [结束.结束]/2 http://eel.is/c++draft/over.over#2,我们执行模板参数推导。这对于所有三个重载都会成功:在第一个重载中,保持[temp.deduct.funcaddr]/2 http://eel.is/c++draft/temp.deduct.funcaddr#2心里:

函数模板的返回类型中的占位符类型 (7.1.7.4) 是非推导上下文。如果模板 对于这样的函数,参数推导成功,返回类型由实例化确定 函数体。

Since the deduction will succeed (given that all template parameters have explicitly supplied arguments), the return type is deduced as int. In the second case, deduction succeeds since the argument is provided, and in the third, T will be deduced.

继续到第4段 http://eel.is/c++draft/over.over#4,

如果选择了多个功能,[...]任何给定的功能 函数模板特化F1如果集合包含则被消除 第二个函数模板特化,其函数模板是 比函数模板更专业F1根据 14.5.6.2 的部分排序规则。经过这样的消除后,如果有的话,应仅保留一项选定的功能。

根据[温度扣除部分]/3 http://eel.is/c++draft/temp.deduct.partial#3,函数模板的函数类型用于部分排序。我们立即可以看到#1和#2的函数类型不包含任何参与推导的模板参数,因此通过添加[温度扣除部分]/4 http://eel.is/c++draft/temp.deduct.partial#4由核心问题引入1391 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1391的分辨率,其对应的Ps 不用于确定顺序。 @bogdan 解释道here https://stackoverflow.com/a/31735126/3647361为什么该决议有问题;最重要的是,排序只会导致 #1 和 #2 产生歧义。

也就是说,根据当前(可能有缺陷)的措辞,转换在所有情况下都是格式错误的。如果非依赖/推导参数对的部分排序是固定的,

  • 情况 1 和 3 是不明确的,因为对于两个非依赖函数类型(#1 和 #2),不存在排序对。
  • 情况 2 中的接受行为是正确的(如预期)。

[temp.deduct.type]/8 http://eel.is/c++draft/temp.deduct.type#8 element 9 (T()), in case you were curious.

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

使用 auto 的模板函数重载解析 的相关文章

随机推荐

  • Rails - 警告:无法批量分配受保护的属性

    从这里继续 Rails 表单问题 https stackoverflow com questions 6058486 rails form problems 每次我尝试创建一个新的group membership我明白了 WARNING C
  • Rails db:种子错误“未定义方法‘finder_needs_type_condition?’对于 nil:NilClass"

    我在尝试填充 sqlite 数据库时遇到问题 关于特定错误 finder needs type condition 的信息不多 我可以找到 但我没有太多使用 Rails 的经验 甚至怀疑问题可能出在哪里 Model class Charac
  • 如何使用Android相机获取全分辨率和未压缩的图像数据?

    我想获得全分辨率 而不是压缩 图像数据 然后我可以进行一些图像处理 据我所知 android api takePicture shutter raw jpg 可以做一些事情 但是我需要的不是压缩的 JPEG 数据 而是未压缩的图像数据 而且
  • 有没有 StringUtils.isNumeric 的替代方案可以实现我的意思?

    StringUtils isNumeric 对于 返回 true 对于 7 8 返回 false 这当然是有记录的行为 但对我来说确实不是最方便的 还有其他东西 最好是在 commons lang 中 提供 isActuallyNumeri
  • 如何降低firebase实时数据库下载成本? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在firebase实时数据库中制作2个数据库是否有助于降低成本并增加每天360MB的每日下载限制 降低成本最简单的方法是减少下载 你可
  • 在 JasperReports 中进行比较 if else

    我想做一个比较 例如 if
  • Order by 不适用于 LINQ 中的 Concat()

    使用 VB net 和以下 LINQ 语句 我怀疑 排序依据 不适用于Concat 我想列出用户当前拥有的项目 然后按升序列出更多可用项目 因此 首先我从数据库中选择当前项目 然后按顺序选择下一个可用项目 LINQ 忽略 order by
  • 如何在 Mac 上将 localhost 绑定到 127.0.0.1? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的本地计算机上有一个正在运行的 Web 应用程序 要访问它 我可以使用localhost 8080 但是当我尝试使用http 127 0
  • MVC3中提交数据库数据后如何清除模型

    我正在数据库中提交一些数据 提交后我想显示同一页面 但我正在查看页面 文本框值不为空 ModelState Clear 我曾经用来清除文本框 但文本框值仍然保留 请建议我在mvc3中提交后清除模型 public ActionResult A
  • 重置 DBUnit 中的序列?

    我想在 Java DBUnit 中的每次测试后重置数据库 AND 序列 我已经看到这个问题 但没有我正在努力获得的代码解决方案 如何在DBUnit中使用Oracle序列号 https stackoverflow com questions
  • 在 ruby​​ 类中调用 Knife

    我想围绕刀创建一个很好的包装类 以允许程序以可读的方式运行刀命令 我目前正在尝试使用 Chef gem 中的 Knife rb 文件作为取得成功的指南 但是 我在关闭编辑器时遇到问题 如果我运行以下代码 require chef knife
  • 过滤数据集

    我有一个充满客户的数据集 我想知道是否有任何方法可以过滤数据集并仅获取我想要的信息 例如 要得到CostumerName and CostumerAddress对于有的客户CostumerID 1 是否可以 您可以使用DataTable S
  • Twitter Bootstrap - 如何根据 @media 定义的宽度更改 css 类

    这是我的第一个问题 但我只想说这个网站多年来帮助了我无数次 我想我已经到了有自己的问题要问的阶段了 抱歉 如果问题不清楚 我会尝试详细说明 我已经为我的一些元素分配了一个过渡 这样当它们悬停在上面时它们就会向上升起 即 example ho
  • Python 使用 Beautiful Soup 对特定内容进行 HTML 处理

    所以当我决定解析网站的内容时 例如 http allrecipes com Recipe Slow Cooker Pork Chops II Detail aspx http allrecipes com Recipe Slow Cooke
  • 如何在 Python 中处理命令行参数? [复制]

    这个问题在这里已经有答案了 如果我期望像 001 或 999 这样的东西 这次让我们将期望限制在 001 999 范围 并且传递的其他参数很少 并且希望忽略任何意外的参数 那么处理命令行参数的简单表达式是什么 我知道 例如 如果我需要查明
  • Facebook 身份验证对话框(JS SDK)返回空白屏幕

    我正在设置一个 Rails 应用程序并尝试通过 Facebook JS SDK 实现登录 已经缺少 Omniauth 无论如何 发生的情况是弹出对话框 用户提供登录信息 但随后它重定向到https www facebook com conn
  • 如何使用服务帐户访问 GSuite 电子邮件帐户的 GMAIL API

    我希望我的服务帐户能够模拟 GSuite 中的用户之一 我有 通过 GCP 创建项目 在项目中启用GMail API 向该项目添加了一个服务帐户 启用了domain wide delegation在服务帐户设置中GCP 添加了一个API C
  • .Net 中的缓存和 WebBrowser 控件

    我正在使用 Net 中的 WebBrowser 控件来执行一些第三方联属营销转换 我在数据库中有一个队列表 其中包含要执行的所有脚本 图像 我使用 WebBrowser 控件在 WinForms 应用程序中循环遍历所有这些内容 执行脚本 图
  • 使用 bash 命令结果设置 ant 属性

    我怎样才能设置antproperty 的值是 bash 脚本执行的结果 例如 我需要有一个利用的目标svn and bash实用程序以控制构建执行 更具体地说 我尝试创建的目标将用于定义通过命令部署的应用程序中是否有修改的文件 svn st
  • 使用 auto 的模板函数重载解析

    具有以下 3 个重载 template