首页 >后端开发 >C++ >为什么删除的 C 11 函数仍然参与重载解析?

为什么删除的 C 11 函数仍然参与重载解析?

Linda Hamilton
Linda Hamilton原创
2024-12-23 10:13:18210浏览

Why Do Deleted C  11 Functions Still Participate in Overload Resolution?

为什么重载解析包括 C 11 删除的函数

C 11 引入了 = delete 语法,它将函数标记为“已删除”,从而防止他们的召唤。这就提出了一个问题,为什么这些函数仍然参与重载决策而不是被完全消除。

=delete 的主要目的是防止调用带有某些参数的特定函数。它的目的是禁止隐式转换,特别是在可能导致意外后果的情况下。因此,参与重载决策对于=delete有效地禁止特定重载至关重要。

考虑以下示例:

struct onlydouble {
  onlydouble(std::intmax_t) = delete;
  onlydouble(double);
};

如果 =delete 完全删除了该函数,它将具有相同的效果效果如下:

struct onlydouble2 {
  onlydouble2(double);
};

在这种情况下,以下代码将是valid:

onlydouble2 val(20);

编译器会尝试调用采用整数的构造函数,但会隐式将 20 转换为双精度数并成功调用采用双精度数的构造函数。

但是,使用 = delete 时,明确禁止调用采用 intmax_t 的 onlydouble 构造函数。编译器不会尝试隐式转换,而是会发出错误,从而阻止使用此禁止的重载。

此外,= delete 意味着“我禁止此”而不是“此不存在”。 C 规范没有定义“不存在”函数的概念。相反,它提供了一种显式禁止某些调用的机制,允许程序员控制编译器的行为并防止不需要的隐式转换。

以上是为什么删除的 C 11 函数仍然参与重载解析?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn