持有对派生类的引用的基类

2024-06-18

我想这样做:

struct Derived;

struct Base{
    Derived const& m_ref;
    Base(Derived const& ref) : m_ref(ref){}
};

struct Derived: Base{
    Derived(): Base(*this){}
};

但我似乎得到了不可靠的行为(稍后使用时,m_ref指向无效的派生的东西)。

是否允许构造对 Derived from 的引用*this在类初始化之前?

我明白这是无效的use这样的引用直到它被初始化为止,但我不知道类的初始化的更改如何影响对它的引用(因为初始化它不会在内存中移动它......)。

我不知道该怎么称呼我正在尝试做的事情,所以我对这方面的信息的搜索一片空白......



Update:我无法用简单的测试用例重现我的问题,所以看起来是这样probably好吧(虽然我无法证明这一点,但仍然欢迎明确的答案)。 怀疑我的问题是由损坏的复制赋值运算符引起的。但这完全是另一回事!

Update 2我的复制构造函数和复制赋值运算符确实是罪魁祸首,现在这似乎工作可靠。但仍然对它是否是明确定义的行为感兴趣。


3.8/1 说:

T 类型对象的生命周期 开始于: — 正确储存 T 型的对齐方式和尺寸为 获得,并且 - 如果 T 是类类型 带有一个不平凡的构造函数(12.1),构造函数调用已完成.

3.8/5 说:

在对象的生命周期开始之前但在分配该对象将占用的存储空间之后或者,在对象的生命周期结束之后且在该对象占用的存储空间之前 重新使用或释放​​,指向对象将位于或曾经位于的存储位置的任何指针 可以使用,但只能以有限的方式使用。这样的指针指的是分配的存储空间(3.7.3.2),并使用 指针就好像指针是 void* 类型一样,是明确定义的。这样的指针可以被取消引用,但是 生成的左值只能以有限的方式使用,如下所述。

“低于”为 3.8/6:

这样的左值指的是分配的存储(3.7.3.2),并使用左值的属性,这些属性不 取决于它的值是否明确定义。

...然后是你不能做的事情的清单。绑定到对相同派生类型的引用不属于其中。

我在其他地方找不到任何可能使您的代码无效的内容。值得注意的是,尽管 8.3.2/4 中有以下短语:

引用应初始化为 引用有效的对象或函数。

似乎没有任何“有效对象”的定义可言。

于是,经过一番来回之后,我必须得出结论:这是合法的.


当然,这并不是说这是一个好主意! 它看起来仍然是一个糟糕的设计。

例如,如果您稍后更改基本构造函数,并且以下任何内容变得相关(同样从 3.8/6 开始):

  • 左值用于访问非静态数据成员或调用对象的非静态成员函数
  • 左值隐式转换 (4.10) 为对基类类型的引用
  • 左值用作 a 的操作数static_cast(5.2.9)(除非最终转换为char& or unsigned char&
  • 左值用作 a 的操作数dynamic_cast(5.2.7) 或作为操作数typeid.

...那么你的程序将是未定义的,并且编译器可能不会为此发出任何诊断信息!


随机其他观察

我注意到其他几个有趣的在编译这个答案时发生的事情,这是一个分享它们的好地方。

首先,9.3.2 似乎留下了类型this in a 构造函数初始化器意外未指定。奇怪!

其次,3.8/5(与我在 3.8/6 中引用的列表不同)对指针设置的标准包括:

如果该对象将是或曾经是 非POD类类型,该程序有 未定义的行为如果 [..] 指针隐式转换 (4.10) 指向基类类型的指针。

我相信这会导致以下看似无害的代码未定义:

struct A {
   A(A* ptr) {}
};

struct B : A {
   B() : A(this) {}
};

int main() {
   B b;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

持有对派生类的引用的基类 的相关文章

  • 为什么更新外键后引用约束会不一致?

    抱歉 这个模糊的标题很难用一句话来描述 我有 2 个实体User and UserAddress 其中 User 有 2 个外键DefaultInvoiceAddressId and DefaultDeliveryAddressId和 Us
  • 根据当前文化调用不同(本地化)视图

    我在用着LocalizationAttribute它实现了ActionFilterAttribute本地化视图 我简单地说 Localize 在控制器上 我使用 LocalizeStrings resx 文件根据当前线程上的语言进行应用 一
  • 以 ISO 8601 格式输出日期

    如何在 C 中获取以下格式的日期 2016 04 26T19 50 48Z include
  • 您使用什么工具和技术来查找死代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪些工具和技术来查找 NET 中的死代码 过去 我用 Obsolete 属性修饰方法 传递 tr
  • 获取当前用户的 NetworkCredential (C#)

    我正在尝试从控制台应用程序调用 Web 服务 并且我需要向客户端提供System Net NetworkCredential object 是否有可能创建一个NetworkCredential启动应用程序的用户的对象而不提示输入用户名 密码
  • 带方括号的 Uri.EscapeUriString

    这是一个奇怪的问题 但让我们看看它会得到什么样的回应 如果我编写一个控制台应用程序 VS 2013 NET 4 5 1 并执行这行代码 Uri EscapeUriString 我明白了 但是 如果我执行同样的事情 嗯 从技术上来说Uri E
  • 在子目录中构建共享库

    我正在尝试构建一个使用一些 C 代码的 R 包 我有一个编译为可执行文件的 C 库 可以从命令行调用 有一个与之关联的 Makefile 我正在尝试获取信息here http cran r project org doc manuals R
  • 使用索引避免迭代器失效,维护干净的接口

    我创建了一个MemoryManager
  • 指向指针的指针和指向二维数组的指针之间的区别

    如果我有一个二维数组 B 定义为 int B 2 3 1 3 5 2 4 6 Is int p B与 一样int p 3 B int f B printf d f 1 gives 5作为输出 同时printf d f 给出 1 作为答案 为
  • 在 Windows 服务中使用 OleDb 从 Excel 读取数据?

    免责声明 我知道这是一种不好的做事方式 这是我们与客户的唯一选择 Problem 我们需要每隔 x 时间从 Excel 文件读取数据 数据通过第三方 Excel 插件不断变化 应用程序的环境是 Windows XP SP1 和 Net 2
  • ObjectTrackingEnabled 和 linq-to-sql

    I read here http www sidarok com web blog content 2008 05 02 10 tips to improve your linq to sql application performance
  • 如果 .txt 文件不存在,则创建一个,如果存在则追加新行

    我想创建一个 txt 文件并写入它 如果该文件已经存在 我只想添加更多行 string path E AppServ Example txt if File Exists path File Create path TextWriter t
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • 内存不足异常

    我正在使用 C 和 asp net 开发一个网络应用程序 我一直收到内存不足的异常 该应用程序的作用是从数据源读取一堆记录 产品 可能是数百 数千 通过向导中的设置处理这些记录 然后使用处理的产品信息更新不同的数据源 虽然有多个 DB 类
  • 嘲笑会员用户

    我目前正在开发一个 asp net mvc 2 应用程序 它使用默认的 SqlMembershipProvider 进行身份验证 我已经实现了一个控制器方法 通过调用读取当前用户的 ProviderUserKeyMembership Get
  • 除法时的小数舍入误差 (C#)

    我基本上有四个数字 比如 100 200 300 400 我需要计算概率为 100 100 200 300 400 200 100 200 300 400 等等在 当我使用小数数据类型来存储这些概率时 由于舍入问题 它们不会达到 1 在不使
  • 简单的喷射器将具体类型与生活方式结合起来

    我正在寻找一种可以使用指定的生活方式注册具体类型的方法 基本上如下所示 public void SomeFunction Type concrete Lifestyle lifestyle gt container Register con
  • 为什么 ASP.Net MVC Range 属性采用类型?

    我只是想知道为什么范围验证属性可以采用类型和两个字符串作为参数 这是为了根据枚举或类似的东西验证字符串吗 另外 我想做的是找到一种简单的方法来验证必须出现在枚举中的 3 个字符的字符串 有什么建议吗 谢谢 亚历克斯 我确实发现你提到的 Ra
  • 预览MouseMove 与 MouseMove

    我有相当多的 XAML 经验 但最近我注意到我的大多数同事都使用预览鼠标移动代替鼠标移动事件 我一直用鼠标移动它对我很有帮助 但我忍不住问我什么时候应该使用预览鼠标移动什么时候鼠标移动 有什么区别 各自有什么优点和缺点等等 PreviewM
  • 有关 Endian 性和 .Net 的详细信息?

    我有几个关于字节顺序的问题 这些问题足够相关 我保证将它们作为一个问题提出 1 字节顺序是由 Net还是由硬件决定的 2 如果是由硬件决定的 我怎样才能在C 中找出硬件的字节序 3 字节序是否影响二进制交互 例如 OR AND OR 或移位

随机推荐

  • d3.js - .exit().remove() 组元素不起作用

    我正在构建一个动态条形图 查看肯尼亚和坦桑尼亚男孩和女孩的考试成绩 用户可以从下拉菜单中选择他们想要查看哪个国家 肯尼亚 坦桑尼亚 和哪一年 2010 年 2011 年 的分数 我已清理所有数据并将其组织到单独的国家 地区年份 csv 文件
  • 如何在java中使用$lookup阶段与spring data mongodb? [复制]

    这个问题在这里已经有答案了 到 Spring 的最新版本 我已经看到很多堆栈溢出问题 这表明 spring data mongodb 中不支持此操作新的 spring data mongodb 1 10 0 中是否支持此操作 db orde
  • 水平居中包含浮动 li 元素的

    我一直在尝试制作一个带有悬停下拉菜单的水平导航栏 我已经让它工作了 但是为了让 中的所有元素并排 水平 它们必须应用 float left 有什么办法让他们回到中心吗 另外 我的 CSS 编码风格 正确吗 我觉得我做错了 谢谢 HTML d
  • C 数组计数(初学者)[重复]

    这个问题在这里已经有答案了 我目前正在阅读 Kernighan 和 Richie 所著的 C 编程语言 我正在努力弄清楚一行代码的作用 我想我只是有点愚蠢 不太明白他们的解释 ndigit c 0 我不得不稍微改变一下程序ndigit之前给
  • 使用 PDFBox 在 PDF 上绘制矢量图像

    我想使用 Apache PDFBox 在 PDF 上绘制矢量图像 这是我用来绘制常规图像的代码 PDPage page PDPage document getDocumentCatalog getAllPages get 1 PDPageC
  • asyncio 服务器和客户端处理来自控制台的输入

    我有一个 asyncio TCP 服务器 它从客户端获取消息 在服务器上执行 stuff 并发送回文本 服务器运行良好意味着正确接收和发送数据 问题是我无法从客户端的服务器取回消息 因为我在控制台输入上有阻塞例程 基本上 data rece
  • 使用php将cmyk转rgb

    我正在使用以下脚本将图像保存在文件夹中 但有一张图像显示此消息 图像无法显示 因为它包含错误 我认为问题出在图像上称为 cmyk 和 rgb 的东西 但是当在网上搜索使用 php 将 cmyk 转换为 rgb 的方法时 我找不到如何执行此操
  • 将 JSON 文件读入 Spark 时出现 _corrupt_record 错误

    我有这个 JSON 文件 a 1 b 2 这是通过Python json dump方法获得的 现在 我想使用 pyspark 将此文件读入 Spark 中的 DataFrame 根据文档 我正在这样做 sc SparkContext sql
  • 使用 Cosmos 客户端将集合中的记录数读取到控制台应用程序

    我正在使用 Cosmos 客户端和 C 从集合中删除项目 在这个过程中 我想检查集合中的记录数 我有其中的数据部分和查询 但我不知道要使用什么 因为我只会接收一个 int 而不是数据流 为了删除数据 我使用 FeedIterator 因为我
  • grep 通过彩色文本,例如海湾合作委员会 |颜色gcc | grep 正则表达式

    在 grep 管道输出时 如何使 grep 尊重 ANSI 颜色转义 我很高兴使用其他东西 perl 而不是 grep 我的用户案例 我想要 gcc foobar c colorgcc grep regexp ls color grep f
  • 无法将 Material UI 安装到新的 React 应用程序

    我是开发世界的新手 我正在尝试使用材质 UI 作为组件库启动一个新的 React 应用程序 但我不断收到以下错误 我的文件如下所示 任何人都可以用通俗的语言提供帮助吗 TIA npm install save legacy peer dep
  • 使用可达性有什么好处?

    与下面的代码相比 使用 Reachability 有什么优势 我觉得 Reachability 有大量代码 但如果它在任何方面更好 那么我会使用它 NSString connectionString NSString alloc initW
  • 如何在 MVC 应用程序中转置 Kendo UI 网格中的行和列?

    我在 MVC 应用程序中使用 Kendo Ui Grid 我希望在我的网格中显示多个国家 地区的统计数据 我从数据库检索数据的方式 我的网格将显示类似于以下内容的数据 Country Area Population GDP GDP Grow
  • 忽略下划线模板中未定义的数据/变量

    仍在学习骨干 所以请耐心等待 我正在尝试向视图添加一个带有空白字段的新模型 但我创建的模板有一大堆
  • 仅当值发生更改时如何插入数据库?

    我需要更新 替换 MySQL 数据库中的字段 但前提是它们已更改 该表包含 ID 文本字段和更改日期 用户根据更改日期通过 ID 查询数据 即 如果该日期早于用户上次查询数据的时间 则他不想要它 仅当文本字段与具有相同 ID 的现有文本字段
  • 类型错误:.substring 不是函数

    我正在运行 Acrobat Pro DC 我有一个带有 Action OnBlur 事件的文本字段 CC CardNumber 该事件运行以下脚本来产生此错误 我已经研究了几个小时 但看不出我的代码哪里不正确 var fld this ge
  • 在 Node.js 中查找默认网关 IP 的最佳方法是什么?

    如今在 Node js 中查找默认网关 IP 地址的最佳方法是什么 os networkInterfaces 不提供此信息 想到的唯一想法是解析stdout子流程的route n Kernel IP routing table Destin
  • WKWebView不加载https URL?

    我有一个 WKWebView 应该加载以下网址 https buchung salonmeister de place offer details page id 907599 venueId 301655 她是我使用的代码 import
  • 当我将列表分配给变量时,为什么 Pycharm 会提示我“此列表创建可以重写为列表文字”?

    我是一个Python初学者 有一个难题 当我写这样的代码时 lst 1 2 3 4 Pycharm给我的提示是 这个列表创建可以重写为列表文字 但如果换成 lst list 1 2 3 4 Pycharm什么也没说 谁能告诉我为什么 这段代
  • 持有对派生类的引用的基类

    我想这样做 struct Derived struct Base Derived const m ref Base Derived const ref m ref ref struct Derived Base Derived Base t