Meh*_*dad 7 c++ return-type covariance
为什么以下代码是协方差错误?是不是T *有协void *...?
struct Base { virtual void *foo(); };
struct Derived : Base { int *foo(); };
Run Code Online (Sandbox Code Playgroud)
GCC说:
invalid covariant return type for 'virtual int* Derived::foo()'
Run Code Online (Sandbox Code Playgroud)
[class.virtual]/p7,强调我的:
重写函数的返回类型应与重写函数的返回类型相同或与函数类的协变相同.如果函数
D::f覆盖函数B::f,则函数 的返回类型如果满足以下条件则是协变的:
- 两者都是指针类,两者都以引用左值类,或两者都是rvalue引用类 [脚注省略]
- [...]
来自D&E的第294-5页:
AFER一些考虑的替代方案,我们决定允许的压倒一切
B*由D*和的B&一个D&地方B是一个可接入基站D.此外,const可以在安全的地方添加或减少.我们决定不放宽规则,允许技术上是可行的转换,如D以可访问的基地B,一D到X了该D有一个转变,int*要void*,double要int等,我们认为,从通过重载允许这种转换带来的好处不会大于实施成本和混淆用户的可能性.