首页 > 后端开发 > C++ > C 11 中删除的函数如何影响重载解析?

C 11 中删除的函数如何影响重载解析?

Mary-Kate Olsen
发布: 2024-12-15 15:22:24
原创
376 人浏览过

How Do Deleted Functions in C  11 Influence Overload Resolution?

C 11 中已删除函数的重载解析

C 11 允许使用 = delete 语法将函数标记为“已删除”。 ”此语法阻止编译器生成函数体并禁止其直接调用。但是,这些删除的函数仍然参与重载决策,该过程根据给定的一组输入参数确定要调用的最合适的函数。

此功能为何有用?为什么删除的函数会被隐藏而不是从代码中完全删除?

主要原因是根据参数类型禁用特定的重载。通过参与重载决策,删除的函数可以防止可能导致意外行为的隐式转换。考虑以下示例:

struct onlydouble {
  onlydouble(std::intmax_t) = delete;
  onlydouble(double);
};
登录后复制

如果 delete 完全删除了该函数,则它实际上会使 = delete 语法等效于:

struct onlydouble2 {
  onlydouble2(double);
};
登录后复制

通过此更改,以下代码将是合法:

onlydouble2 val(20);
登录后复制

编译器会在调用采用 a 的构造函数之前尝试将整数文字 20 隐式转换为双精度数double.

相比之下,在删除构造函数的原始示例中,编译器将检测函数参数 (std::intmax_t) 和参数 (20) 之间的精确匹配。然后它会引发错误,因为它选择了一个已删除的函数来调用。

因此,= delete 语法可以更好地控制根据参数类型调用哪些函数。它可以防止可能导致意外后果的隐式转换。

此外,“这不存在”的概念在 C 规范中不是必需的,因为:

  • 存在特殊语法删除函数(“我禁止这个”)
  • 隐式定义的函数(例如复制构造函数)存在于默认
  • 重载解析通过识别不匹配或歧义来处理函数“存在”
  • 删除函数的主要目的是控制重载解析,而不是指示不存在

以上是C 11 中删除的函数如何影响重载解析?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板