为什么 C 11 删除的函数参与重载解析
C 11 引入了 = delete 语法来防止调用某些函数重载具体参数类型。这种行为可能看起来不寻常,因为人们可能期望在重载决策期间将已删除的函数完全从考虑中删除。但是,做出此设计决策是有特定原因的。
防止隐式转换
= delete 的一个主要目的是禁止在某些情况下使用隐式转换。当删除重载的函数参与重载决策时,它可以确保编译器选择完全匹配或报告错误。这可以防止使用隐式转换无意中调用已删除的重载。
考虑下面的示例:
struct onlydouble { onlydouble(std::intmax_t) = delete; // Prevent implicit conversion from integer onlydouble(double); };
如果已完全删除已删除的重载,则允许使用以下代码:
onlydouble val(20);
编译器会隐式地将整数文字转换为 double 并选择未删除的重载。但是,当删除的重载参与重载解析时,编译器会拒绝该代码,因为它将删除的重载标识为与整数文字参数完全匹配。
特殊语法与“这不存在”
有人可能会问为什么 C 11 将 = delete 定义为“我禁止这个”而不是“这个不存在”。答案在于不需要明确的语法来表示不存在。未定义的标识符和缺少的特殊成员函数隐式地传达了“this 不存在”的概念。
结论
C 11 删除函数参与重载解析以防止隐式转换并强制使用某些参数类型。此设计功能允许精确控制函数重载的调用,在不需要隐式转换或导致歧义的情况下提供优势。
以上是为什么 C 11 删除的函数仍然参与重载解析?的详细内容。更多信息请关注PHP中文网其他相关文章!