首选隐式转换,而不是另一个

问题描述 投票:4回答:1

我遇到了许多对类,我将它们称为LegacyModern,它们具有相同类型的转换构造函数。

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) { ... }

是否有一种方法可以修改LegacyModern的构造函数,使得隐式转换始终首选Modern的构造?

f(42); // should call f(Modern(42))

[[over.ics.user]]似乎不允许在包含用户定义的转换的隐式转换中进行任何排名(换句话说,调用是模棱两可的,仅此而已,但也许我忽略了某些事情。

c++ implicit-conversion
1个回答
2
投票

最简单的方法是使Legacy的构造函数明确。这应该具有与排名相同的最终效果,因为即使您对隐式构造函数进行了“排名”,调用Legacy的唯一方法是显式调用它。

也就是说,转换构造函数可能会引起混乱和错误,因此您可以考虑将两者都明确。

© www.soinside.com 2019 - 2024. All rights reserved.