如何从重载解析中删除重载函数?
How to delete a overload function from overload resolution?
>假设我有一个类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"; }
};
而不是让两个重载参与并在选择错误重载时导致错误,而是从上下文中推断出目标类型,然后决定是否应从重载解析中删除重载。单次重载不会有歧义。
相关文章:
- 如何从重载解析中删除重载函数?
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- C++:如果我重载新运算符,我是否也必须重载删除运算符?
- 为什么在析构函数中引发异常时不调用重载删除
- 重载运算符>>从二叉树中删除节点
- 重载运算符 new/new[] 删除/删除[] 全局C++
- C++ 运算符删除重载对派生类不起作用
- 防止将临时传递为常量引用的方法,该方法比删除 r 值重载更好地缩放
- 使用(模板化的)已删除的函数重载来防止常见的算术转换
- 全局删除的冲突重载
- 如何删除模板类的输出操作程序重载的错误
- 不能只删除方法的常量重载?
- 当调用来自同一个重载的非常量版本成员函数时,可以删除常量限定符吗
- 带有已删除的移动构造函数的不明确重载
- 运算符新建和删除重载作用域
- 在c++中的赋值运算符重载方法中删除旧的动态分配内存
- 如何摆脱此错误 main.cpp:43:19: 错误:没有可行的重载 '=' novowels[100] = 删除(名称[100]);
- C++ 中的重载删除运算符
- 析构函数与重载删除
- 操作符重载删除函数