我想让我的类的一个实例转换为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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)