转换序列歧义:转换构造函数与运算符的优先级
从 A 类对象初始化 B 类对象时,存在歧义如果同时定义了转换构造函数和转换运算符,则可能会出现这种情况。这些函数之间的交互决定了将调用哪一个。
优先级建立
根据 C 标准(8.5/14),用户定义的转换序列可以从 A 转换为 B 被枚举,并通过重载决议选择最好的一个。仅当转换构造函数不适用时才考虑转换运算符。
参数转换
重载解析将转换函数和构造函数转换为与调用参数匹配的参数列表。对于转换运算符,会生成隐式对象参数,从而在运算符的函数参数和源对象之间创建绑定。
获胜候选人
转换运算符由于“最少 const 资格”规则而获胜 (13.3.3.2/3)。在这种情况下,构造函数 B(const A&) 有一个 const 引用作为其参数,而转换运算符运算符 B() 有一个非常量引用。由于源对象是右值(临时),非常量引用可以绑定到它。
面向对象的视角
从面向对象的角度来看, A 的转换运算符相对于 B 的构造函数的默认选择表明源类 (A) 有责任定义转换过程。然而,作为目标类的 B 是否应该对这种转换承担主要责任仍然存在争议。
以上是转换序列歧义:转换运算符何时胜过构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!