C++在重载operator=为带模板的函数的时候的陷阱
来源:互联网 发布:淘宝远望手机可靠吗 编辑:程序博客网 时间:2024/06/06 11:39
原文地址 https://segmentfault.com/a/1190000004467381
最近被一个语法问题缠了半天,终于找到了原因。不仔细思考一下写的时候真的很容易忽略。先看代码:
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) { /*...*/ }
0 0
- C++在重载operator=为带模板的函数的时候的陷阱
- 陷阱重重的C++赋值重载函数operator=
- 陷阱重重的C++赋值重载函数operator=
- 重载set的operator<()函数
- 奇怪的C++operator重载
- 运算符重载 编程题#3(专项课程3;重载:* operator, & operator=, & operator(); 函数 memcpy 的使用)
- 模板函数的重载
- 正确的重载operator+
- 正确的重载operator
- 正确的重载operator+
- 不能重载的operator
- 正确的重载operator+
- operator delete的重载
- 函数模板与同名的非模板函数重载的时候,两者调用顺序
- 以模板的方式重载"operator <<"需要注意的地方
- C++ 对于多重继承 重载operator = 时候的细节注意
- operator new / operator delete等的重载
- 带模板参数的运算符重载
- 美赛论文格式
- Android 使用WebService
- android 隐藏系统键盘
- 第十四周阅读程序——3
- java注解
- C++在重载operator=为带模板的函数的时候的陷阱
- How to write a good bug report
- angularjs 2的开发中遇到的bug之一
- 华为短信开发包开发联通sgip1.2接口协议报错
- 财务凭证的替代
- Failed to create 'build\outputs\apk\watch-debug-unaligned.apks': 拒绝访问。
- 每日一得--JNDI 是什么
- 《深入理解Spark:核心思想与源码分析》2次印刷修订内容清单
- Nginx 基础数据结构