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中文网其他相关文章!