$10.3/5
“重写的返回类型
函数应等于
被覆盖的返回类型
函数或与类的协变
的功能。如果函数 D::f
覆盖函数 B::f,返回
函数的类型是协变的
如果他们满足以下条件
标准:
— 两者都是指向
类或对类的引用98)
— B::f 返回类型中的类
与中的班级是同一班级
D::f 的返回类型,或者是
明确且可直接访问或
该类的间接基类
D::f 的返回类型
— 指针或引用都有
相同的简历资格 and 这
D::f 返回类型中的类类型
具有与或相同的简历资格
简历资格低于班级
输入 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;}
^
那么问题是,科莫在第 9 行给出的“警告”信息是否正确?我知道这是一个实现定义的行为,科莫只是想表现得友善一些。但在这种情况下,充其量是令人困惑的。
第 5 行和第 9 行警告“返回类型上的类型限定符毫无意义”是因为非类类型右值永远不会经过 cv 限定。
由于按值返回的函数的结果是右值,并且指针是非类类型,因此返回的指针不是 cv 限定的,即使返回类型表明它是 cv 限定的。
此警告与协方差无关。以下函数会导致相同的警告:
int* volatile f() { return 0; }
至于10.3/5中引用的文本:
指针或引用都具有相同的简历限定
这是指返回类型的顶级限定(即volatile
in const int* volatile
)。顶级资质虽然没有任何意义,但does影响函数的类型,因此给出的声明f
上面,这个片段是不正确的:
int* (*q)() = f; // error: can't convert int* volatile (*)() to int* (*)()
同样,如果派生类成员函数中返回类型的顶级 cv 限定与基类中返回类型的顶级 cv 限定不匹配,则派生类成员函数不会重写基类成员函数。
返回类型中的类类型D::f
具有与返回类型中的类类型相同或更少的 cv 限定B::f
.
这是指返回值的类类型的限定(即const
in const int* volatile
)。该规则意味着派生类成员函数中的返回类型的限定必须等于或小于它重写的基类成员函数的返回类型的限定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)