$10.3/5
“覆盖函数的返回类型应与被覆盖函数的返回类型相同或与函数的类协变。如果函数 D::f 覆盖函数 B::f,则函数的返回类型如果它们满足以下标准,则它们是协变的:
— 两者都是类的指针或类的引用 98)
— B::f 的返回类型中的类与 D::f 的返回类型中的类是同一类,或者是 D 的返回类型中的类的明确且可访问的直接或间接基类: :F
—指针或引用都具有相同的 cv 限定,并且D::f 的返回类型中的类类型具有与 B::f 的返回类型中的类类型相同或更少的 cv 限定。
struct A{};
struct B : A{};
struct X{
virtual const A * const f(){return 0;}
};
struct Y : X{
virtual const B * volatile f(){return 0;}
};
int main(){
Y b;
X &r = b;
r.f();
}
我写了上面的实验代码,发现 Comeau 的错误/警告不一致。第 9 行中的警告似乎表明返回类型中的 cv 限定符没有意义。正是这个原因导致代码格式错误。
"ComeauTest.c", line 5: warning: type qualifier on return type is meaningless
virtual const A * const f(){return 0;}
^
"ComeauTest.c", line 9: warning: type qualifier on return type is meaningless
virtual const B * volatile f(){return 0;}
^
"ComeauTest.c", line 9: error: return type is not identical to nor covariant with
return type "const A *const" of overridden virtual function function
"X::f"
virtual const B * volatile f(){return 0;}
^
所以问题是,Comeau 在第 9 行发出“警告”信息是否正确?我知道这是一种实现定义的行为,Comeau 只是想表现得很好。但在这种情况下,它充其量是令人困惑的。