转换构造函数与转换运算符:优先级
在 C 中,转换构造函数和转换运算符都可以用于在不同类之间转换对象,但它们在重载决策中的优先级有时会导致意外结果。
问题 1:优先级建立
在问题提供的代码片段中,编译器选择尽管存在匹配的转换构造函数,但仍调用转换运算符operator B()。这表明在这种情况下转换运算符具有优先级。
根据 C 标准 (8.5/14),“可以从源类型转换为目标类型的用户定义的转换序列 [... ] 如 13.3.1.4 中所述枚举,并通过重载决策 (13.3) 选择最佳的一个。”
问题 2:面向对象哲学
来自从面向对象的角度来看,人们可能会认为定义转换的类(在本例中为 A)应该对如何执行转换有更多的发言权。然而,在 C 中,编译器主要考虑类型安全和效率。
转换运算符通常更高效,因为它可以内联,而转换构造函数需要显式调用。此外,转换运算符可以设置为 const,这允许绑定到右值,从而在某些情况下具有优势。
选择转换方法
之间的优先级转换构造函数和转换运算符是由 C 标准 13.3.3.2/3 中描述的重载解析过程建立的。在提供的代码的情况下,选择转换运算符是因为它具有更少的 const 限定符,并且可以更有效地绑定到右值 A()。
一般来说,在转换构造函数和转换运算符之间进行选择取决于关于代码的具体要求。如果效率和与右值的绑定很重要,那么转换运算符可能是更好的选择。但是,如果转换逻辑很复杂或者应该由目标类控制,则转换构造函数可能更合适。
以上是转换构造函数与转换运算符:C 中哪个优先?的详细内容。更多信息请关注PHP中文网其他相关文章!