如何从重载决策中删除重载函数?

How to delete a overload function from overload resolution?

假设我有一个 class 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"; }
};

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