为什么我不能将返回类型与void*协变?

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)

T.C*_*.C. 7

[class.virtual]/p7,强调我的:

重写函数的返回类型应与重写函数的返回类型相同或与函数类的协变相同.如果函数D::f覆盖函数B::f,则函数 的返回类型如果满足以下条件则是协变的:

  • 两者都是指针,两者都以引用左值,或两者都是rvalue引用 [脚注省略]
  • [...]

来自D&E的第294-5页:

AFER一些考虑的替代方案,我们决定允许的压倒一切B*D*和的B&一个D&地方B是一个可接入基站D.此外,const可以在安全的地方添加或减少.我们决定不放宽规则,允许技术上是可行的转换,如D以可访问的基地B,一DX了该D有一个转变,int*void*,doubleint等,我们认为,从通过重载允许这种转换带来的好处不会大于实施成本和混淆用户的可能性.

  • 如果你能解释一下这个设计背后的"原因",那就太好了. (2认同)