C++在重载operator=为带模板的函数的时候的陷阱

发布时间:2019-06-27 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了C++在重载operator=为带模板的函数的时候的陷阱脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

最近被一个语法问题缠了天,终于找到了原因。不仔细思考一下写的时候真的很容易忽略。先看代码:

template<typename T>
class A {
public:
    const T t = 0;

    template<typename OtherT>
    A& operator=(const A<OtherT>& a) { return *this; }
};



int main()
{
    A<int> a, b;

    b = a; // error
}

这会带来一个编译错误,然而横睇掂睇都看不出问题。于是我就试了一下这样的代码:A<float> c; b = c;居然通过了编译。F**k,这个模板居然胳膊肘往外拐。

其实我在写这个代码的时候忽略了一点,就是default assignment operator,它是你在定义类的时候编译器默认给你加上去的,行为是对所有成员变量赋值。它的声明是A& operator=(const A& a);,跟我们自己定义的放在一起:

template<typename OtherT>
A& operator=(const A<OtherT>& a) { return *this; }

A& operator=(const A& a) /*= delete*/;

恰好构成了模板特化,这就糟了。一旦构成了特化,OtherT可以匹配的类型就会除去int,用A<int>赋值时只能调用系统给我们定义的那个。然而它也不起作用,因为成员里面有常量(这样它就会被标记为= delete,留意delete并不会令OtherT可以匹配到int,反而令它匹配不到)。

知道了原因之后,解决就很方便了,只要重新定义这个默认赋值运算符就好:

A& operator=(const A& a) { /*...*/ }

记录一下,以后不要踩这种坑了 T_T。唉现在天都黑了。

脚本宝典总结

以上是脚本宝典为你收集整理的C++在重载operator=为带模板的函数的时候的陷阱全部内容,希望文章能够帮你解决C++在重载operator=为带模板的函数的时候的陷阱所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。