我遇到了许多对类,我将它们称为Legacy
和Modern
,它们具有相同类型的转换构造函数。
struct Legacy { Legacy(int); };
struct Modern { Modern(int); };
甚至可能是模板构造函数:
struct Legacy { template <typename T> Legacy(T); };
struct Modern { template <typename T> Modern(T); };
类似地,在这些类型上有很多函数重载:
void f(Legacy) { ... }
void f(Modern) { ... }
是否有一种方法可以修改Legacy
和Modern
的构造函数,使得隐式转换始终首选Modern
的构造?
f(42); // should call f(Modern(42))
[[over.ics.user]]似乎不允许在包含用户定义的转换的隐式转换中进行任何排名(换句话说,调用是模棱两可的,仅此而已,但也许我忽略了某些事情。
最简单的方法是使Legacy
的构造函数明确。这应该具有与排名相同的最终效果,因为即使您对隐式构造函数进行了“排名”,调用Legacy
的唯一方法是显式调用它。
也就是说,转换构造函数可能会引起混乱和错误,因此您可以考虑将两者都明确。