为什么重载解析包括 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中文网其他相关文章!