首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >协变返回类型

协变返回类型
EN

Stack Overflow用户
提问于 2010-08-29 05:08:34
回答 1查看 2.8K关注 0票数 2

10.3/5美元

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

-两者都是指向类或对classes98的引用的指针)

-返回类型B::f中的类与返回类型D::f中的类相同,或者是返回类型D::f中类的一个明确和可访问的直接或间接基类

-指针或引用都具有相同的cv限定返回类型D::f中的类类型具有与或小于cv-资格的cv限定,低于返回类型B::f.中的类类型。

代码语言:javascript
复制
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限定符没有意义。正是这个原因导致了代码的格式不正确。

代码语言:javascript
复制
"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只是想表现得更好。但在这种情况下,它是最令人困惑的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-29 05:16:42

第5和第9行中关于“返回类型上的类型限定符没有意义”的警告是因为非类类型rvalue从来都不是cv限定的。

由于按值返回的函数的结果是rvalue,而指针是非类类型,因此返回的指针并不是cv限定的,即使返回类型表明是的。

此警告与协方差无关。以下函数将导致同样的警告:

代码语言:javascript
复制
int* volatile f() { return 0; }

关于10.3/5所引用的案文:

指针或引用都具有相同的cv限定条件。

这指的是返回类型的顶级限定(即volatile in const int* volatile)。虽然顶级限定没有意义,但它确实会影响函数的类型,因此,考虑到上面f的声明,这个片段是不正确的:

代码语言:javascript
复制
int* (*q)() = f; // error:  can't convert int* volatile (*)() to int* (*)()

同样,如果派生类成员函数中返回类型的顶级cv限定与基类中返回类型的顶级cv限定不匹配,则派生类成员函数不会覆盖基类成员函数。

返回类型的D::f中的类类型与B::f返回类型中的类类型具有相同或更少的cv限定。

这是指返回值的类类型(即const in const int* volatile)的限定。此规则意味着派生类成员函数中的返回类型的限定必须等于或小于它重写的基类成员函数的返回类型的限定。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3593601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档