协变返回类型

2023-12-07

$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(使用前将#替换为@)

协变返回类型 的相关文章

随机推荐

  • Python:Selenium xpath 查找具有不区分大小写字符的元素?

    我有能力做到这一点 search View List driver find elements by xpath text normalize space s parent search 但我需要它忽略并将所有元素与文本匹配 例如 VieW
  • iOS Core Plot CPTAxisLabel 与 CTPlot 对齐

    请看下面这张图片 我已附上文件 我的问题是CPTAxisLabel标签 它们被放置在勾号下方 但不被放置在CPTPlot如我所愿 如何向该标签添加左偏移量 我需要将我的标签放置在中间CPTPlot object 更新 void config
  • 如何编写中间带有参数的 PowerShell 别名?

    我正在尝试设置 Windows PowerShell 别名来使用某些参数运行 MinGW 的 g 可执行文件 但是 这些参数需要位于文件名和其他参数之后 我不想经历尝试设置函数之类的麻烦 有没有一种方法可以简单地说 alias mybuil
  • 如何使两种不兼容的类型,但具有相同的成员,可以互换?

    昨天 我们团队中的两个人来找我 提出了一个不常见的问题 我们正在我们的 winforms 应用程序之一中使用第三方组件 所有代码都已经针对它编写了 然后 他们希望将同一供应商提供的另一个第三方组件合并到我们的应用程序中 令他们高兴的是 他们
  • swift tableview如何选择所有行

    我在表格视图中有按钮 我想当我按下该按钮时将选择所有单元格行 该怎么做 我尝试了很多但一无所获 我很困惑如何让按钮接触细胞 我试图让 var 像这样 var x false 那我确实喜欢 if x true Code 当你按下按钮时它就会是
  • 使用 Python 解析文件中的嵌套循环

    目前Python读取文件的每一行并执行一个函数doStep 该函数将传递正在读取的行上的任何内容 data txt a b c b read py fin open data txt for step in fin doStep step
  • Android Wear:收听传入通知

    是否可以在可穿戴 Android 应用程序中监听传入通知 我尝试过实施一个通知监听服务 但是服务的onNotificationPosted 从未被称为 public class MyListenerService extends Notif
  • 如何将应用提交到应用商店?

    我最近制作了我的第一个 iPhone 应用程序 我对 iPhone 编程完全陌生 如何将应用提交到应用商店 因为我是菜鸟 所以我会得到一些详细解释的更好帮助 您可以在中找到详细的解释iOS 开发者计划用户指南
  • 使用 Writer 将 int 写入文本文件

    Writer wr new FileWriter 123 txt wr write 123 wr close 输出文件包含 哪里有问题 怎么写int到文本文件使用Writer 你必须写字符串 你可以试试 wr write 123 OR wr
  • 从 PHP 5.3 开始,mssql_connect 不再工作

    我刚刚收到我们主机的一封电子邮件 他们已将 PHP 升级到 5 3 但不幸的是 所有脚本现在都已损坏 我追踪到了这个函数mssql 连接失败 支持人员告诉我 这在 5 3 中已被弃用 这怎么可能是真的 现在如何在 PHP 5 3 下连接到
  • 如何解决GCC中的包含文件名冲突?

    我有两个名为string h在不同的库中 它们相互冲突 甚至与标准C包含文件的同名冲突 无需使用任何string h除了标准的 但我需要在 GCC 搜索路径中包含库头路径 目前我使用类似的东西 I usr local include lib
  • 如何调试 dsymutil 错误:“Clang 模块预计只有 1 个编译单元。”

    在 iOS 应用程序的GenerateDSYMFile 阶段收到此错误消息 Users name Library Developer Xcode DerivedData ModuleCache HASH FrameworkName HASH
  • EOFException - 如何处理?

    我是一名初学者 Java 程序员 遵循java教程 我正在使用一个简单的 Java 程序Java教程 s 数据流页面 并且在运行时 它不断显示EOFException 我想知道这是否正常 因为读者最终必须到达文件的末尾 import jav
  • HMVC codeigniter 适用于本地服务器,但不适用于 Web 服务器

    这真是要了我的命 我有什么 CI版本 2 1 4 模块化扩展 HMVC 作者 wiredesignz 一个基本的 codeigniter hmvc 项目 可以与 php 5 5 3 的本地服务器 mamp 中的设置配合良好 我的问题 在我将
  • 如何获取默认的 Cargo 输出目录以匹配目标架构?

    我希望构建输出目录遵循我正在构建的架构 目前 当我在没有任何目标的情况下使用 Cargo build 时 它将输出放入 target debug 或 target release 中 当我为其他目标架构构建时 它将它们放入 target a
  • android - 文本输入类型人名不起作用

    在我的 android 项目中 我想要一个类型为 personname 的文本字段 默认情况下大写锁定处于激活状态 但是 此代码不起作用
  • 如何防止 Spring 应用程序上下文关闭,直到关闭钩子被触发

    我有一个弹簧启动应用程序 我已经实施了SmartLifecycle我的 bean 中的接口启动了异步 snmp 服务器start方法并将其停止在其中stop method 一切工作正常 除了主应用程序上下文在启动后立即停止 因此我的服务器
  • Heroku 应用程序数据库重置

    在 Heroku 上运行完 Python 入门后 我启动了我的第一个应用程序 一切似乎都工作正常 但过了一会儿 可能几个小时 数据库会重置 我对根本原因的假设是我的 django 应用程序使用默认的 django 数据库 我认为是 SQLi
  • MVC WebApi 中的方法如何映射到 http 动词?

    在以下链接的 5 分钟视频中 在 1 分 10 秒处 Jon Galloway 表示 将名为 DeleteComment 的方法添加到他的 CommentsController 控制器类中将按照约定自动映射到删除 http 动词 带有 We
  • 协变返回类型

    10 3 5 重写的返回类型 函数应等于 被覆盖的返回类型 函数或与类的协变 的功能 如果函数 D f 覆盖函数 B f 返回 函数的类型是协变的 如果他们满足以下条件 标准 两者都是指向 类或对类的引用98 B f 返回类型中的类 与中的