给定三个具有不同参数类型的重载函数(值、右值引用、const 左值引用),如果所有三个重载都可行,则函数调用可能会变得不明确。本文讨论了在此类场景中管理重载决策的规则,并探讨了在 C 中观察到的细微行为。
仅考虑一个参数,该规则规定一个参数初始化必须是比两者另外两个更好的匹配。比较两个初始化时,要么认为其中一个更好,要么都认为两者都更好(无法区分)。
如果没有直接引用绑定的特殊规则,这三个初始化在所有三个比较中将无法区分。然而,这些特殊规则将 int&& (右值引用)提升到高于 const int& (左值引用),但两者都不被认为比 int (值)更好或更差。因此,不会出现最佳匹配。
以下矩阵说明了此行为:
S1 S2 int int&& indistinguishable int const int& indistinguishable int&& const int& S1 better
该矩阵显示 int&& 优于 const int&基于 C 标准第 13.3.3.2 条。此规则适用于不引用没有 ref 限定符的非静态成员函数的隐式对象参数的引用绑定,并且其中 S1 将右值引用绑定到右值,而 S2 绑定左值引用。
但是,当其中一个初始化不是引用绑定时,此规则不适用,因此存在歧义。
作者建议将 int&& (右值引用)视为比 int (值)更好的匹配,因为引用必须绑定到初始值设定项,而对象类型不受此类约束。这可能会创建一个新的重载解析规则,该规则优先考虑来自初始值设定项的绑定。然而,这个提议需要通过 isocpp 未来提案平台进行进一步讨论和潜在的标准化。
以上是Value、Rvalue Reference 和 Const Lvalue Reference 参数之间何时会出现 C 重载解析歧义?的详细内容。更多信息请关注PHP中文网其他相关文章!