新的放置和 const 成员的类分配

2023-12-20

为什么这是未定义的行为?

struct s
{
    const int id; // <-- const member

    s(int id):
        id(id)
    {}

    s& operator =(const s& m) {
        return *new(this) s(m); // <-- undefined behavior?
    }
};

(引用标准就好了)。

这个问题源于这个答案 https://stackoverflow.com/a/11602256/1729784.


没有什么可以使所示的代码片段本质上是 UB 的。然而,几乎可以肯定的是,在任何正常使用情况下,UB 都会立即跟随。

From [基本生活]/8 http://eel.is/c++draft/basic.life#8(强调我的)

如果一个对象的生命周期结束后,在该对象占用的存储空间被重用或释放之前,在原对象占用的存储位置上创建一个新的对象,一个指向原对象的指针,一个指向该对象的引用引用原始对象,或者原始对象的名称将自动引用新对象,并且一旦新对象的生命周期开始,可用于操作新对象,如果:

  • 新对象的存储完全覆盖原始对象占用的存储位置,并且

  • 新对象与原始对象具有相同的类型(忽略顶级 cv 限定符),并且

  • 原始对象的类型不是 const 限定的,并且,如果是类类型,不包含任何类型为 const 限定的非静态数据成员或引用类型,以及

  • 原始对象是该类型的最派生对象T并且新对象是该类型的最派生对象T(也就是说,它们不是基类子对象)。

由于有一个const成员于s,在调用后使用原始变量operator=将是UB。

s var{42};
var = s{420};         // OK
do_something(var.id); // UB! Reuses s through original name
do_something(std::launder(&var)->id);  // OK, this is what launder is used for
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

新的放置和 const 成员的类分配 的相关文章

  • 使用内部构造函数实例化类

    我有一个类 其构造函数被定义为内部 这意味着我无法实例化它 虽然这可能有道理 但出于调试和研究目的 我仍然愿意做一次 是否可以通过反射来做到这一点 我知道我可以访问私有 内部成员 但是我可以调用内部构造函数吗 或者 由于构造函数没有做任何重
  • 警告:从指针目标类型中丢弃“const”限定符

    没有const char s意味着 s 是一个指向常量 char 的指针 那么为什么它给我这个警告 我并不是想改变价值观 在第一个函数中警告是return discards const qualifiers from pointer tar
  • 如何使用 C# 打印 pdf

    我在 C 应用程序中使用 进程 打印 pdf 文件 但是我无法获取打印状态 我发现可以通过 System management 和 System printing 与打印机 队列进行交互 我做了很多尝试 但都出错了使用这两个命名空间但无法打
  • C++ 有像 Pascal 一样的“with”关键字吗?

    withPascal 中的关键字可用于快速访问记录的字段 有人知道 C 是否有类似的东西吗 前任 我有一个包含许多字段的指针 但我不想这样输入 if pointer gt field1 pointer gt field2 pointer g
  • C/C++ 中随机数生成器的实现[重复]

    这个问题在这里已经有答案了 我对 C 中随机数生成器的实现有点困惑 它也与 C 中的明显不同 如果我理解正确 对 srand seed 的调用会以某种方式初始化可通过 rand 访问的隐藏变量 种子 该变量又将函数指向预先生成的序列 例如例
  • 在 MVC 类上创建主键字段

    我是 MVC 和 C 新手 我只是偶然发现它并发现它很有趣 我遇到了一个不允许我继续的问题 这是我的代码 using System using System Collections Generic using System Linq usi
  • 为什么 LinkedList 通常比 List 慢?

    我开始在我的一些 C 算法中使用一些 LinkedList 而不是列表 希望能够加快速度 然而 我注意到他们只是感觉更慢 像任何优秀的开发人员一样 我认为我应该尽职调查并验证我的感受 所以我决定对一些简单的循环进行基准测试 我认为用一些随机
  • initializer_list 和默认构造函数重载决策

    include
  • Windows 程序如何临时更改其时区?

    我写了一个函数来返回time t与给定日期的午夜相对应的值 当给定日期没有午夜时 它返回最早可用的时间 例如 当埃及进入夏令时时 这种情况就可能发生 今年 时间更改于 4 月 29 日晚上午夜生效 因此时钟直接从 23 59 转到 01 0
  • 在 C++ 中处理音频缓冲区时,如何执行从 float -> double -> float 的转换

    我目前正在开发一个应用程序 其中音频样本帧在以下回调中进行处理 void Eav07AudioProcessor processBlock AudioSampleBuffer buffer for int channel 0 channel
  • IBM Watson 对话服务错误:无法从“方法组”转换为“conversation.onMessage”

    我正在尝试运行 IBM Watson会话服务团结和下面是代码片段 https github com watson developer cloud unity sdk conversation private Conversation m C
  • AspNetCore.SignalR:无法启动未处于初始状态的连接

    我无法让 ASP NET Core SignalR 应用程序正常运行 我有这个服务器端代码 public class PopcornHub Hub private int Users public async Task BroadcastN
  • 使用 cudamalloc()。为什么是双指针?

    我目前正在浏览有关的教程示例http code google com p stanford cs193g sp2010 http code google com p stanford cs193g sp2010 学习CUDA 演示的代码 g
  • C# - 命名空间内的类型声明

    在命名空间内而不是在类中声明类型的可能用途是什么 For ex namespace Test public delegate void Ispossible 这是有效的并且不会产生任何编译错误 但我无法想象为什么我们会以这种方式声明它而不是
  • 停止 TcpListener 的正确方法

    我目前正在使用 TcpListener 来处理传入连接 每个连接都有一个线程用于处理通信 然后关闭该单个连接 代码如下 TcpListener listener new TcpListener IPAddress Any Port Syst
  • 使 C# 编译器相信执行将在成员返回后停止

    我认为目前这是不可能的 或者这是否是一个好主意 但这是我刚才正在考虑的事情 我使用 MSTest 对我的 C 项目进行单元测试 在我的一项测试中 我执行以下操作 MyClass instance try instance getValue
  • 无效的模板相关成员函数模板推导 - 认为我正在尝试使用 std::set

    我有一个继承自基类模板的类模板 基类模板有一个数据成员和一个成员函数模板 我想从我的超类中调用它 我知道为了消除对成员函数模板的调用的歧义 我必须使用template关键字 我必须明确引用this在超级班里 this gt base mem
  • Visual Studio 2015默认附加库

    当我在 VS 2015 中创建一个空项目时 它会自动将这些库放入 附加依赖项 中 kernel32 lib user32 lib gdi32 lib winspool lib comdlg32 lib advapi32 lib shell3
  • 网页执行回发时如何停止在注册表单上?

    我正在做我的最后一年的项目 其中 我在一页上有登录和注册表单 WebForm 当用户点击锚点时Sign Up下拉菜单ddlType 隐藏 和文本框 txtCustName txtEmail and txtConfirmPassword 显示
  • XmlDocument Save 使文件保持打开状态

    我有一个简单的 C 函数 可以创建一个基本的 XML 文件并保存 private void CreateXMlFile string Filename string Name string Company XmlDocument doc n

随机推荐

  • 在 Material MatDialog 中动态加载组件

    谁能提供一个如何将组件动态加载到 Material MatDialog 中的示例 我想做的是 我将为 MatDialog 配置数据提供一个组件类型 然后对话框将创建一个实例并将其放置在其 mat dialog content 区域内 看来我
  • 显示当前目录内容的便携方式

    我想在期间向用户提供附加信息restart case缺少输入文件 有没有一种便携式方法可以打印当前目录中的文件 请看一下文件系统概念 http clhs lisp se Body 20 a htm 特别是在directory http cl
  • 多线程参考? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 这个问题的答案是社区努力 help privileges edit community wiki 编辑现
  • 隐藏空
  • 我想隐藏所有 li 如果它们是空的或者里面有空格 li li 我这样做是这样的 li empty filter function i v return trim v text length 0 css display none 这是错误的语
  • 使用 Gekko 求解方程组时,是否有办法处理零超零问题?

    我正在使用 gekko 来 尝试 求解方程组 我遇到一个问题 因为我的方程中的一项类型是m asin q1 T q2 m sqrt 1 q1 T q2 2 where q1 and q2是 R3 中的单位向量 当它们方向相同时 分子和分母为
  • “include”指令可以在 nginx 的上游块中使用吗?

    我的网站使用两个应用程序服务器 即 app1 和 app2 因此在配置中我有这样的内容 upstream cluster server app1 8080 server app2 8080 由于每次更新代码时我都需要重新启动两个服务器进程并
  • 如何在Python中检查对象的类型? [复制]

    这个问题在这里已经有答案了 我的变量有一些值v 如何检查其类型 提示 事实并非如此v dtype 当我做type v 在调试器中 我得到 type v type
  • 使用ant检查可执行命令是否存在

    是否可以检查命令是否存在作为 ant 任务的一部分 例如 我想确保 yasm 命令作为 ant 任务的一部分出现 这可能吗 如果是这样 你能举个例子吗 以下习惯用法可用于在环境路径中的某个位置查找可执行文件
  • Node.js 中的password_hash 等效项

    我面临着需要验证通过 PHP 创建的密码的情况password hashNodejs 服务器上的方法 Does nodejs有一个可用的包相当于password hash and password verify 谢谢 就我而言 我在 php
  • 如何在python中获取图像指定区域中的所有像素坐标?

    图像中的区域由 4 个坐标定义x1 y1 x2 y2 x3 y3 x4 y4我想检索所有像素坐标x y在该区域内 假设是一个矩形 你可以使用np mgrid https docs scipy org doc numpy reference
  • Idea intellij 插件无法在 android studio 1.5.1 中工作

    我正在为 android studio 开发一个测试插件 当使用 从磁盘安装插件 添加时 我的插件可以在 Android studio 1 5 中工作 创建的操作可见 但同一个 jar 文件在 Android studio 1 5 1 中不
  • 如何彻底清除、重置和重启Cassandra集群?

    我有一个旧的 Cassandra 集群需要恢复活力 我想清除所有用户和系统数据 所有存储的令牌 所有内容并从头开始 有推荐的方法吗 以下是我用于 Apache Cassandra 的过程 首先在所有节点上停止 Cassandra 然后在每个
  • Facebook 登录 sdk - Android

    我正在尝试通过 Facebook 登录连接我的应用程序 我做了所有这些steps https developers facebook com docs facebook login android 我面临着一个奇怪的问题 所以登录按钮可以工
  • 使用 SharpZipLib 解压缩特定文件?

    我正在尝试使用 SharpZipLib 从 zip 存档中提取指定的文件 我见过的所有示例总是期望您想要解压缩整个 zip 并执行以下操作 FileStream fileStreamIn new FileStream sourcePath
  • 递归SQL和不同级别的信息

    是否可以在同一查询中显示有关不同递归级别的信息 select LEVEL ae2 CAB ae2 NIVEAU ae2 ENTITE ae2 ENTITE PARENT ae2 libelle from my table ae2 where
  • 在 R 中读取 JSON 文件时出现问题

    我有一个 JSON 文件 从 mongoDB 导出 我想将其加载到 R 中 该文档大小约为 890 MB 大约有 63 000 行 每行 12 个字段 这些字段是数字 字符和日期 我想最终得到一个 63000 x 12 的数据框 lines
  • 动态规划的硬币找零算法

    我在动态规划方面面临困难 我正在尝试解决简单的硬币找零问题 我正在尝试使用自上而下的方法进行记忆 但我得到了 TLE 这是我的代码 include
  • 我如何设置heroku postgresql应用程序的路径?

    我刚刚安装了heroku PSQL 应用程序 v1 0 但无法使用gem pg 0 1 4 连接我的rails 应用程序 我已经将路径 PATH Applications Postgres app Contents MacOS bin PA
  • 如何使用 CsvHelper 解析时处理空列?

    我有一个 CSV 文件 我正在尝试解析它 但是在 int 数据类型列上出现以下错误 在文件中 我传递了该列的空白或空值 AutoMap typeof Test FileEntity Test public class TestFileEnt
  • 新的放置和 const 成员的类分配

    为什么这是未定义的行为 struct s const int id lt const member s int id id id s operator const s m return new this s m lt undefined b