如何从过载解析中删除函数
How do I remove a function from overload resolution?
使用赋值运算符时,我希望将类的实例转换为int
。所以我写了这个代码:
struct X
{
X() = default;
X& operator=(int) { std::cout << "operator=(int)n"; return *this; }
operator int() { return 0; }
};
int main()
{
X a, b;
a = b;
}
但它不会被调用。这是因为它调用了隐式复制赋值运算符,该运算符与参数完全匹配。我希望我的代码首先调用b
上的转换运算符,然后将int
返回值绑定到operator=()
。
是否有语法告诉编译器"不要考虑这个函数"?换句话说,如何从过载解析中删除函数?
我试过在复制赋值运算符上使用模板,这样我就可以执行SFINAE,但我想这只是创建了另一个函数,所以非模板函数总是更匹配。
隐式创建的赋值运算符保持最佳版本,即使您= delete
它,也就是说,您会得到一个错误,而不是选择另一个版本。我建议简单地转发适当的逻辑,而不必费力地删除功能:
X& X::operator= (X const& other) {
return (*this) = static_cast<int>(other);
}
诚然,这可能允许一个额外的隐式转换序列,否则可能不允许:
T -> X -> int
为了应对这种可能性,您可以添加另一个分配运算符:
template <typename T>
X& X::operator= (T&& other) {
int arg = other;
return (*this) = arg;
}
为了防止编译器创建默认函数,您必须声明主题私有(注意,您不需要定义主题)
要了解更多信息,我建议你阅读scot Meyers的有效c++第2章第6项。
只写
a = static_cast<int>(b);
相关文章:
- 为什么我的双向链表删除函数会删除多个节点?
- unique_ptr实现接口时对已删除函数的引用
- 可视代码 删除函数括号内的空格
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- 试图引用已删除函数数组的相等运算符
- 双链表堆栈删除函数不起作用
- 是否需要删除函数中未使用的新结构?
- C++引用已删除函数错误
- 删除函数环境中C++输入 R 对象
- 删除函数中的对象C++
- 在 C++ 中使用删除函数的不同方式
- C++错误:C2280 - 引用已删除函数的编译器错误?
- C++,删除函数/迭代进程中定义的动态数组
- 删除函数 c++ 的读取访问冲突异常
- 如何对此自定义C 列表类实现删除函数
- 双向链表问题(特别是复制构造函数和删除函数)
- 引用 std::atomic <bool>的已删除函数错误
- 在删除函数自由度的指针后,为什么我会得到核心转储
- C++删除函数
- 返回 C++11 中已删除函数的类型