如何从重载解析中删除重载函数?

How to delete a overload function from overload resolution?

本文关键字:重载 删除 函数      更新时间:2023-10-16

>假设我有一个类STest,我希望它能够隐式投射到char const*而不是bool

struct STest {
operator char const*() const& { return "abc"; }
operator bool() const& = delete;
};
void bar(bool) {}
void foo(bool) {}
void foo(char const*) {}

调用bar(STest{})时,此实现按预期(错误(工作。但它不适用于foo(STest{})因为删除函数也在重载分辨率中考虑,并且它抱怨歧义。有没有办法解决这个问题,这意味着bar(STest{})引发错误并foo(STest{})调用foo(char const*)

您可以使用转换运算符模板,并使用 SFINAE 对其进行约束。

struct STest {
template<typename T, std::enable_if_t<std::is_same<char const*, T>::value, int> = 0>
operator T() const& { return "abc"; }
};

而不是让两个重载参与并在选择错误重载时导致错误,而是从上下文中推断出目标类型,然后决定是否应从重载解析中删除重载。单次重载不会有歧义。