提问者:小点点

如何从过载解析中删除一个过载函数?


假设我有一个类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*)


共1个答案

匿名用户

您可以使用转换运算符模板,并用SFINAE约束它。

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

这不会让两个重载参与进来并在选择错误的重载时导致错误,而是从上下文推导目标类型,然后决定是否应该从重载解析中删除重载。 使用一个重载就不会有歧义。