考虑以下代码:
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
变体。
operator=
被选择为任何类型?