如何从重载分辨率中删除函数?

时间:2014-11-07 21:41:12

标签: c++ c++11

我希望在使用赋值运算符时将我的类的实例转换为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=()

是否有语法告诉编译器&#34;不考虑此功能&#34;?换句话说,如何从重载决策中删除函数?

我已尝试在复制赋值运算符上使用模板,因此我可以执行SFINAE但我想这只是创建了另一个函数,因此非模板函数总是更好的匹配。

3 个答案:

答案 0 :(得分:4)

隐式创建的赋值运算符即使您= 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;
}

答案 1 :(得分:0)

为防止编译器创建默认函数,您必须声明主题私有(请注意,您不需要定义主题) 有关更多信息,我建议您阅读scot Meyers第2章第6项的有效c ++。

答案 2 :(得分:0)

只需写下

a = static_cast<int>(b);