转换运算符 + 转换构造函数 = 不直观的行为?

2023-11-23

我不明白为什么下面的代码会打印struct Value代替int(这意味着转换构造函数正在转换为Value代替int)。 (视觉C++ 2012)

为什么会发生这种情况?为什么编译器完全忽略Value(int)构造函数?

#include <iostream>
#include <type_info>

using namespace std;

struct Value { Value(int) { } };

struct Convertible
{
    template<class T>
    operator T() const
    { throw typeid(T).name(); }
};

int main()
{
    try { Value w((Convertible())); }
    catch (char const *s) { cerr << s << endl; }
}

Edit:

更奇怪的是this(这次仅是 C++11,在 GCC 4.7.2 上):

#include <iostream>
#include <typeinfo>

using namespace std;

struct Value
{
    Value(Value const &) = delete;
    Value(int) { }
};

struct Convertible
{
    template<class T>
    operator T() const
    { throw typeid(T).name(); }
};

int main()
{
    try { Value w((Convertible())); }
    catch (char const *s) { cerr << s << endl; }
}

这使:

source.cpp: In function 'int main()':
source.cpp:21:32: error: call of overloaded 'Value(Convertible)' is ambiguous
source.cpp:21:32: note: candidates are:
source.cpp:9:3: note: Value::Value(int)
source.cpp:8:3: note: Value::Value(const Value&) <deleted>

如果删除了复制构造函数,那为什么还有歧义?!


在第一个示例中,Visual Studio 不正确;该调用含糊不清。 C++03 模式下的 gcc 打印:

source.cpp:21:34: error: call of overloaded 'Value(Convertible)' is ambiguous
source.cpp:21:34: note: candidates are:
source.cpp:9:5: note: Value::Value(int)
source.cpp:6:8: note: Value::Value(const Value&)

回想一下,复制构造函数是隐式默认的。管辖段落是13.3.1.3 通过构造函数初始化[over.match.ctor]:

当直接初始化类类型的对象时[...],重载决策会选择构造函数。对于直接初始化,候选函数是被初始化对象的类的所有构造函数。

在第二个示例中,删除的函数同样参与重载决策;它们仅在解决重载后(当选择已删除函数的程序格式错误时)才会影响编译。标准中的激励示例是只能从浮点类型构造的类:

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

转换运算符 + 转换构造函数 = 不直观的行为? 的相关文章

  • 如何获取mp3曲目的时长?

    我想问一下如何在应用程序中获取音频文件的长度 我正在像这样加载曲目 var installFolder Windows ApplicationModel Package Current InstalledLocation var resou
  • static const 和 constexpr 变量有什么区别? [复制]

    这个问题在这里已经有答案了 我明白 一个constexpr variable可以在编译时使用 对于模板 或者例如 static assert 但如果我想在没有 constexpr 的情况下做到这一点 我可以static const 自从 C
  • 忽略控制器参数缺失导致的异常

    我有一个使用 MVC4 构建的面向互联网的网站 我偶尔会收到来自机器人或好奇的用户发送不完整 URL 请求的错误报告 例如 public class ProductController Controller HttpGet public v
  • C# 参数隐式转换

    有这个代码 class Program static void Main string args Check 3 Console ReadLine static void Check int i Console WriteLine I am
  • C++:空类的对象的大小是多少?

    我想知道可能是什么空类对象的大小 肯定可以not为 0 字节 因为它应该可以像任何其他对象一样引用和指向它 但是 这样的物体有多大呢 我用了这个小程序 include
  • 将 ManualResetEvent 包装为可等待任务

    我想等待手动重置事件 并超时并观察取消 我想出了类似下面的东西 手动重置事件对象由我无法控制的 API 提供 有没有办法在不占用和阻塞 ThreadPool 线程的情况下实现这一点 static Task
  • 有关堆栈大小的警告消息

    I use Visual Studio 2010 with Code Analysis活性 在我的代码中 有一行在函数中分配一些内存 TCHAR someString 40000 代码分析抛出警告信息 警告 C6262 函数使用 40000
  • WTL 子窗口事件处理

    我正在开发窗口应用程序 因为我在左侧和右侧有 2 个子窗口 我想分别处理两个窗口的输入事件 如何实现 My code class EditorWindow public DxWindow public CSplitterWindow m v
  • Boost的Dijkstra算法教程

    我很难弄清楚如何使用 Boost 的 Dijkstra 算法 我已经阅读了他们的示例和文档 但我仍然无法理解如何使用它 Boost的文档 http www boost org doc libs 1 50 0 libs graph doc d
  • 在所有 DataTable 列中查找字符串

    我正在尝试找到一种快速方法来在所有数据表列中查找字符串 跟随不起作用 因为我想在所有列值中搜索 string str whatever foreach DataRow row in dataTable Rows foreach DataCo
  • C# CsvHelper.ValidationException - 为什么?

    我正在尝试在 C 控制台应用程序中使用 CSVHelper 我有一个例外 CsvHelper ValidationException 标头匹配 Numer Dokumentu 未找到索引 0 处的名称 我不知道为什么 因为这个标题位于 cs
  • 无法从 GetSystemTime() 获取毫秒

    我正在尝试打印秒和毫秒分辨率计时 我正在使用GetSystemTime 这是我的代码 GetSystemTime datetime RETAILMSG 1 T Time After Data Sent to USB d d r n date
  • 将 double 转换为 float 后值不正确

    我有一些由 gcc gcc GCC 4 4 4 20100726 Red Hat 4 4 4 13 编译的执行高精度算术的 C 代码 计算的最终结果是一个 double 值 其值为 622 07999995861189 我是将双精度型转换为
  • 实施黑名单的最有效方法

    我开发了一个 Ip 过滤器 并猜测我如何使用任何类型的 esque 数据结构开发一个非常高效且快速的黑名单过滤器 我想做的很简单 每个传入 传出连接我都必须检查被阻止的 IP 列表 IP是分散的 内存使用应该是线性的 不依赖于阻止列表的数量
  • 生成一定范围内的 N 个随机数,其总和为常数

    我想生成从 a b 之间的特定分布 例如均匀随机 抽取的 N 个随机数 其总和为常数 C 我尝试了一些我自己能想到的解决方案 以及在类似线程上提出的一些解决方案 但是他们中的大多数要么适用于有限形式的问题 要么我无法证明结果仍然遵循所需的分
  • 嵌入式控制台日志优化

    不久前我曾发过一篇文章this https stackoverflow com questions 25204389 how to get unique values at preprocessing across files关于SO的问题
  • 使用脚本取消设置 PDF 字体

    我正在使用 xhtml2pdf 库自动创建 PDF 几个月前我有过这个问题 https stackoverflow com questions 25203219 xhtml2pdf doesnt embed helvetica 库嵌入了我没
  • 为什么将静态类内初始化成员传递给采用 const 引用的函数需要该成员有定义?

    这是基于最初提出的问题here https stackoverflow com questions 14547370 confusion about in class initialization of static data member
  • 使用 解释 gprof 输出

    我试图在我的程序中找到性能问题 从而通过分析来检测代码 gprof 创建一个如下所示的平面配置文件 Flat profile Each sample counts as 0 01 seconds cumulative self self t
  • HTTPS文件下载C#

    我需要下载隐藏在 HTTPS 连接后面的文件 我对下载安全网站后面的文件不熟悉 我尝试使用凭据来解决此问题 但无济于事 据我所知 您需要创建并使用证书来完成此操作 但我没有找到任何示例 任何帮助表示赞赏 这就是我现在所拥有的 WebClie

随机推荐

  • 使用 Excel VBA 更改已关闭工作簿中单元格的值?

    我目前在 VBA 中使用此函数来获取关闭的工作簿中单元格的值 我想使用类似的过程将单元格的值设置为我想要的任何值 而无需打开文件 那可能吗 Private Function GetValue path file sheet ref Dim
  • Log4j 2 JSON 配置

    我有一个 XML 配置 我想将其转换为 JSON Log4j 未加载 JSON 版本 并且我找不到任何拼写错误 我的测试代码只是记录一个ERROR水平和一个DEBUG级别消息 仅有的ERROR正在显示消息并且没有生成文件输出 我假设框架回退
  • Unity3D构建错误

    构建播放器时出错 Win32Exception ApplicationName E adt bundle windows x86 64 20131030 sdk tools zipalign exe CommandLine 4 C User
  • 移除锤子事件

    我使用hammer js 库创建一个事件 如下所示 Hammer myElement on doubletap function evt evt preventDefault 那么我怎样才能删除注册的事件呢 我也可以使用 Jquery 吗
  • SQL SUM GROUP BY 两个表

    我很难编写一个 SQL 查询来正确地将 account no 组合在一起并减去一个金额 首先 我编写了这个查询 它更新了所有内容 除了 ACCOUNT NO A 102 应该最终为 4500 而不是两个不同的正确余额 select tran
  • Android 11 使用相机拍摄图像

    文档 https developer android com training camera photobasics 我已按照使用相机捕获图像所需的所有步骤进行操作 private void dispatchTakePictureInten
  • Android 选项卡帮助。应用程序打开时如何将第二个选项卡设置为默认选项卡?

    我创建了一个带有 3 个选项卡的应用程序 该应用程序工作正常 但我希望在应用程序打开时选择并加载第二个选项卡 我该如何设置呢 这是我的代码 public void onCreate Bundle savedInstanceState sup
  • MySQL Workbench 不会连接到 AWS RDS 数据库。错误 - “无法连接到本地主机”[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 This image shows the error pop up when I try to test the connection 当前设置 2015 MacBook Pro 操
  • Grails 2.4.3 无法重新加载控制器或服务

    我已将 Grails 2 3 8 项目升级到 2 4 3 在 2 3 8 中 我们在分叉执行方面遇到了问题 所以我禁用了它 现在 当我启用它并尝试重新加载更改的服务或控制器类时 我收到如下错误 2014 09 25 19 50 37 043
  • 如何根据每个元素的长度对数组进行排序?

    我有一个像这样的数组 arr arr 0 ab arr 1 abcdefgh arr 2 abcd 排序后 输出数组应为 arr 0 abcdefgh arr 1 abcd arr 2 ab 我想要在descending每个元素的长度顺序
  • 使用 ajax 和 jQuery 根据 Flask 中第一个下拉列表中选择的值填充第二个下拉列表

    我在这方面没有任何进展 任何有关此问题的帮助将不胜感激 我有两个针对经理和员工的下拉菜单 默认情况下 经理下拉列表包含经理列表 我想通过使用用户在 经理 下拉列表中选择的经理名称查询 SQL Server 数据库 用员工姓名填充 员工 下拉
  • 十六进制到浮点转换

    我有一个 4 字节的十六进制数 08fdc941 它应该转换为浮点数 25 25 但我不知道如何 我用C 从十六进制转换为浮点数的正确方法是什么 From thisMSDN 页面 如何 在十六进制字符串和数字类型之间进行转换 C 编程指南
  • IE6 - 无法加载普通 JPG

    尝试加载这个普通的 jpg 文件在 Internet Explorer 6 0 中 我收到一条错误消息 指出图片无法加载 在任何其他浏览器中尝试一下 效果很好 怎么了 jpg 文件只是 Web 服务器上的一张普通图片 我什至可以创建一个简单
  • 如何在 UIImageView 底部应用曲线?

    我想在图像视图的底部遮罩并添加一些曲线 我尝试过下面的代码 extension UIImage var roundedImage UIImage let rect CGRect origin CGPoint x 0 y 0 size sel
  • 将条目添加到 HashMap 并在 for 循环中获取对它们的引用

    我正在尝试将多个元素添加到HashMap in a for循环但似乎无法正确执行 use std collections HashMap fn set if needed and get hmap mut HashMap
  • UITableView 中的 UITextFields,输入的值重新出现在其他单元格中

    我有一个大约有 20 个单元格的 UITableView 每个单元格中有三个 UITextField 我没有子类化 UITableViewCell 但在设置每个单元格时 我将文本字段标记值设置为常量加上行号 因此 对于每一行 文本字段的标签
  • MVC4 Razor 对大括号感到困惑

    我有一个相当简单的问题要问所有 Razor 专家 我正在尝试对 URL 进行 jQuery ajax 调用 使用 Url Content 将 home 相对路径转换为 root 相对路径 这样做时 Razor 对我的 section 的末尾
  • 如何从以管理员用户身份运行的 C# 代码重新启动 IIS?

    通常 在 Windows 7 中 安装程序会请求修改系统的权限 作为管理员 我可以在不提供密码的情况下授予授权 我试图弄清楚如何从以 AN 管理员用户身份运行的 C 代码中执行管理员操作 重新启动 IIS 但不是 管理员 帐户 要运行提升的
  • 如何在 C# 中以编程方式解析环境变量而不使用环境枚举? [复制]

    这个问题在这里已经有答案了 可能的重复 展开 我的文档 的环境变量 我们经常在 Windows Xp 7 Vista Server 2003 2008R2 以及可能在未来的 Windows 版本中的命令提示符中使用 分隔的环境变量 例子有
  • 转换运算符 + 转换构造函数 = 不直观的行为?

    我不明白为什么下面的代码会打印struct Value代替int 这意味着转换构造函数正在转换为Value代替int 视觉C 2012 为什么会发生这种情况 为什么编译器完全忽略Value int 构造函数 include