10.3/5美元
“重写函数的返回类型应该与重写函数的返回类型相同,或者与函数的类协变。如果函数D:F覆盖函数B::f,则如果函数满足以下条件,则函数的返回类型是协变的:
-两者都是指向类或对classes98的引用的指针)
-返回类型B::f中的类与返回类型D::f中的类相同,或者是返回类型D::f中类的一个明确和可访问的直接或间接基类
-指针或引用都具有相同的cv限定和返回类型D::f中的类类型具有与或小于cv-资格的cv限定,低于返回类型B::f.中的类类型。
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只是想表现得更好。但在这种情况下,它是最令人困惑的。
发布于 2010-08-29 05:16:42
第5和第9行中关于“返回类型上的类型限定符没有意义”的警告是因为非类类型rvalue从来都不是cv限定的。
由于按值返回的函数的结果是rvalue,而指针是非类类型,因此返回的指针并不是cv限定的,即使返回类型表明是的。
此警告与协方差无关。以下函数将导致同样的警告:
int* volatile f() { return 0; }关于10.3/5所引用的案文:
指针或引用都具有相同的cv限定条件。
这指的是返回类型的顶级限定(即volatile in const int* volatile)。虽然顶级限定没有意义,但它确实会影响函数的类型,因此,考虑到上面f的声明,这个片段是不正确的:
int* (*q)() = f; // error: can't convert int* volatile (*)() to int* (*)()同样,如果派生类成员函数中返回类型的顶级cv限定与基类中返回类型的顶级cv限定不匹配,则派生类成员函数不会覆盖基类成员函数。
返回类型的
D::f中的类类型与B::f返回类型中的类类型具有相同或更少的cv限定。
这是指返回值的类类型(即const in const int* volatile)的限定。此规则意味着派生类成员函数中的返回类型的限定必须等于或小于它重写的基类成员函数的返回类型的限定。
https://stackoverflow.com/questions/3593601
复制相似问题