用模板方法替换隐式删除的运算符

时间:2019-02-03 09:46:34

标签: c++ templates operator-overloading

考虑以下代码:

class Foo { public:
    int const i;
    Foo() : i(0) {}
};

void test() {
    Foo       a;
    Foo const b;
    a = b; //Failure here; `Foo::operator=` implicitly deleted
}

指示的行失败,因为无法生成通常由编译器生成的operator=.i被标记为const。这是很好的,是预期的。

只要程序员不更改operator=,程序员就可以生成自己的.i。例如。此方法无济于事:

Foo& operator=(Foo const& other) { 
    return *this;
}

但是现在,假设我想变得更宽泛。我将方法模板化:

template <typename TypeOther>
Foo& operator=(TypeOther const& other) {
    return *this;
}

突然,我恢复了原来的失败行为(经过测试的Clang,GCC和MSVC)!看来,即使未生成默认的operator=,它也会参与重载解析,因此它被选择而不是template变体。

  1. 为什么即使隐式运算符不存在,也为什么要选择它(即,好像我本人刚刚编写并删除了它-也就是说,它存在但被禁止)?
  2. 如何解决此问题,以使我的模板operator=被选择为任何类型?

0 个答案:

没有答案