使用空大括号初始值设定项重载解析:指针还是引用? [复制]

2024-05-15

当我发现下面的代码输出“指针”时,我遇到了现实生活中的WTF时刻。

#include <iostream>
#include <utility>

template<typename T>
struct bla
{
    static void f(const T*) { std::cout << "pointer\n"; }
    static void f(const T&) { std::cout << "reference\n"; }
};

int main()
{
    bla<std::pair<int,int>>::f({});
}

改变std::pair<int,int>的模板参数int或任何其他原始类型,给出(至少对我来说)预期的“不明确的过载”错误。似乎内置类型在这里很特殊,因为任何用户定义的类型(聚合、非平凡、带有默认构造函数等)都会导致调用指针重载。我相信模板并不是复制它所必需的,它只是让尝试不同类型变得简单。

就我个人而言,我认为这不符合逻辑,并且无论模板参数如何,我都希望在所有情况下都会出现不明确的重载错误。 GCC 和 Clang(我相信 MSVC)在 C++11/14/1z 上都不同意我的观点。注意我完全意识到这两个重载存在的坏 API,而且我永远不会写像这样的事情,我保证 https://github.com/qt/qtbase/blob/dev/src/corelib/thread/qfutureinterface.h#L179.

所以问题就变成了:到底发生了什么事?


哦,这太恶心了。

根据 [over.ics.list]p4 和 p7:

4 否则,如果参数是非聚合类X并且根据 13.3.1.7 的重载决策选择一个最佳构造函数X执行类型对象的初始化X从参数初始值设定项列表来看,隐式转换序列是用户定义的转换序列,第二个标准转换序列是恒等转换。 [...]

[...]

6 否则,如果参数是引用,请参见 13.3.3.1.4。 [注意:本节中的规则将适用于初始化底层临时文件以供参考。 ——尾注] [...]

[...]

7 否则,如果参数类型不是类:

[...]

(7.2) -- 如果初始值设定项列表没有元素,则隐式转换序列是恒等转换。 [...]

建设一个const std::pair<int,int>暂时从{}被视为用户定义的转换。建设一个const std::pair<int,int> *右值,或const int *右值,或const int临时对象都被视为标准转换。

标准转换优于用户定义的转换。

你自己发现的CWG 问题 1536 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1536是相关的,但主要针对语言律师。这是措辞上的一个空白,标准并没有真正说明参考参数的初始化会发生什么{}, since {}不是一个表达式。这并不是导致一个调用不明确而另一个调用不明确的原因,并且实现在这里设法应用常识。

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

使用空大括号初始值设定项重载解析:指针还是引用? [复制] 的相关文章

随机推荐

  • 没有得到 popen 的完整回复

    嗨 我正在使用 popen 运行一个进程 handle popen python scriptos py r while feof handle data fgets handle echo gt data 我只从返回 5 行的进程中获取
  • 在数据库中存储密码的最佳方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何轻松地将 Ajax、perl 和 JSON 结合使用?

    我正在尝试使用 Ajax 制作一个网页 Example 我创建了一个 Perl CGU 文件来触发一个简单的帖子 文件 test cgi name 托马斯 回复短信 你的名字是托马斯 我创建了一个可以使用该帖子的 html 文件 但随后页面
  • 我们如何从 Android 通知中提取 bigpicturestyle 图像?

    我有一个通知侦听器服务 可以读取来自其他应用程序的通知 经用户许可 并提取所有数据 能够访问除通知展开视图中显示的图像之外的所有内容 我也在阅读 EXTRA PICTURE 意图值 if extras containsKey Notific
  • 如果函数来自外部 JavaScript 库,如何处理 JavaScript 中冲突的函数名称?

    我有两个外部 JavaScript lib 文件 我必须加载到同一个文件上JSP http en wikipedia org wiki JavaServer Pages页 它们都有一个名为 autoSave 的函数 两者都没有参数 我无法修
  • 使用 vim pythoncomplete 的 Python 文档字符串不显示我自己的类函数的换行符

    我在尝试使用时得到了一些意想不到的结果Python 全方位补全 http www vim org scripts script php script id 1542在我自己的类函数上 函数的文档字符串未正确设置换行符格式 如下图所示 当我从
  • 如何在yarn中指定本地注册表?

    我有一个本地 Nexus 服务器 基本上我希望在上线之前先查看一下它prefer offline yarn install prefer offline cache folder C folder yarn cache preferred
  • 正则表达式匹配带有连字符和/或撇号的单词

    我正在寻找一个正则表达式来匹配带有连字符和 或撇号的单词 到目前为止 我有 w w w 这在大多数情况下都有效 但如果先有一个撇号 然后有一个连字符 例如 qu est ce 则它不匹配 我可以附加更多选项 尽管也许还有另一种更有效的方法
  • 可能的 std::async 实现错误 Windows

    看来 std async 的 Windows 实现存在错误 在重负载下 大约每秒启动 1000 个异步线程 异步任务永远不会被调度 并且等待返回的 future 会导致死锁 请参阅这段代码 使用延迟启动策略而不是异步进行修改 Bundlin
  • c# - 如何列出硬盘上的所有文件和文件夹?

    我想列出我的程序有权访问的所有文件和文件夹并将它们写入文本文件 我如何获得该列表 我需要一种方法来捕获或不对不可访问的文件夹抛出 UnauthorizedAccessExceptions 请尝试使用代码 private static IEn
  • EF6 Code First 支持表值函数吗?

    是否可以在 EF6 Code First 中调用 TVF 我首先使用 EF6 数据库启动了一个新项目 EF 能够将 TVF 导入到模型中并调用它就好了 但是 对于我一直在处理的没有 RI 的大型只读数据库 更新模型变得非常耗时并且存在问题
  • React 组件等待所需的 props 渲染

    我正在父组件内部声明一个组件 我想在一个文件中建立特定的道具 然后在父组件中 我希望能够同时为子组件建立其他道具 因为它们是共享属性 在大多数情况下 我的问题是 子组件尝试渲染并失败 因为首先没有建立所需的道具类型 有没有办法告诉子组件等待
  • 如何使用 kotlin Android 从 Url 读取 JSON?

    我正在使用 kotlin 来开发应用程序 现在我想从服务器获取 JSON 数据 在java中 我实现了Asyntask以及Rxjava来从Url读取JSON 我也在谷歌搜索 但我无法获得满足我的要求的正确详细信息 如何使用 kotlin 从
  • 使用 Google 云端硬盘缩略图的正确方法是什么?

    我首先尝试存储和使用 API 返回的链接 但它会在短时间内过期 然后我尝试在本地下载并存储图像 并从我的服务器提供它 但是当我没有使用我的帐户登录时 缩略图链接会抛出 404 错误 尽管文档是完全公开的 提供 检索文档缩略图的正确方法是什么
  • KMeans 对不平衡数据进行聚类

    我有一组包含 50 个特征 c1 c2 c3 的数据 行数超过 80k 每行包含标准化数值 范围 0 1 它实际上是一个标准化的虚拟变量 其中一些行只有很少的特征 3 4 即如果没有值则分配 0 大多数行大约有 10 20 个特征 我使用
  • 创建 HTML 元素并向其附加属性,然后将其包装在另一个元素内的最有效方法是什么?

    I found 这个答案 https stackoverflow com a 5674985 538786 这太棒了 但是如果我还必须在该元素周围包裹另一个元素怎么办 这就是我现在正在做的 screenshots append a href
  • 为什么 C# 处理命令行参数的方式不一致?

    在 C 中 直接从 Main 获取命令行参数会省略 exe 名称 这与 C 的传统相反 通过 Environment GetCommandLineArgs 获取相同的命令行参数包括它 对于这种明显的不一致 我是否缺少一些合理的逻辑原因 cl
  • Realm 中的更新语句

    I have VisitingCardPOJO表格 我想更新单个条目说在哪里no 3 VisitingCardPOJO java public class VisitingCardPOJO extends RealmObject Prima
  • 仅在 iPhone X 上显示状态栏

    如果不是 iPhone X 则希望隐藏状态栏 如果是 iPhone X 则希望显示状态栏 这很可能必须以编程方式完成 因为 plist 中没有支持此功能的键 我发现的最接近的一个是UIStatusBarHidden 方法一 You have
  • 使用空大括号初始值设定项重载解析:指针还是引用? [复制]

    这个问题在这里已经有答案了 当我发现下面的代码输出 指针 时 我遇到了现实生活中的WTF时刻 include