我可以通过placement-new覆盖const对象吗?

2023-11-22

基本生活/8告诉我们,我们可以在一个对象的生命周期结束后,使用它占用的存储空间来创建一个新的对象,并使用它的原始名称来引用它,除非:

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

emphasis mine

但是,就在其下方,我们可以看到一条注释:

  • 如果不满足这些条件,则可以通过调用从表示其存储地址的指针获得指向新对象的指针std​::​launder

这解释了的目的std::launder。我们可以有一个类类型const成员并使用placement-new在那里创建一个具有不同内部值的新对象。

让我惊讶的是第一句话的第一部分。它清楚地表明,如果存储const(不一定包含const成员,但整个对象被声明为const),我们不能用它来引用一个新对象,但它可能意味着std::launder可能会修复它。

但我们如何创建这样的对象呢?最简单的例子失败了:

const auto x = 5;
new (&x) auto(10);

这是因为我们无法使用const void*作为放置新的缓冲区。我们可以const_cast它,但抛弃了“真实”constness 是未定义的行为。我相信这里也是如此。

如果只是禁止使用,我会理解const对象作为放置新缓冲区,但如果是这种情况,那么第一个引用中强调的部分的目的是什么?我们能否真正使用重用const不同对象的对象存储?


显然只需要看看just我链接到的标准部分下面有 2 项。基本生活/10告诉我们:

在具有静态、线程或自动存储持续时间的 const 完整对象占用的存储中,或者在此类 const 对象在其生命周期结束之前占用的存储中创建新对象,会导致未定义的行为。

它带有一个示例:

struct B {
  B();
  ~B();
};

const B b;

void h() {
  b.~B();
  new (const_cast<B*>(&b)) const B;     // undefined behavior
}

这最终让我得出一个结论使用是非法的放置-new一个真正的记忆占据了const object。因此,我相信问题中提到的注释(参考点8) 是错误的 - 它应该排除有问题的情况。

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

我可以通过placement-new覆盖const对象吗? 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • 在 Linux 上使用 ncurses 时未定义的引用

    我正在尝试开始在 Linux 上使用 ncurses 开发程序 我什至无法编译 Hello World 示例 这是代码 include
  • Angular UI 中的 $dialog.messageBox() 在哪里?

    我找不到 dialogAngularUI 中的服务 我尝试探索一个简单的messageBox 使用以下命令创建确认对话框 modal 也找不到那个 有人可以建议我如何使用 AngularJS Angular UI 创建一个简单的对话框 比如
  • 在 Spring 3 中组织类以进行组件扫描的明智方法是什么?

    我已经开始使用 Spring 3 开发一个新项目 并且正在使用注释 我喜欢我可以连接我的类来注入依赖项 但我知道这是一个不好的做法context component scan从基础包开始 我正在使用一个DispatcherServlet它有
  • mysql变量中的字段名

    是否可以选择名称为字符串的字段 SELECT fieldname FROM table 我需要这个触发器才能具有动态字段名称 就像是 SET fieldname NEW name UPDATE table SET fieldname 1 如
  • 免费如何知道要免费多少?

    在 C 编程中 您可以将任何类型的指针作为参数传递给 free 它如何知道要释放的已分配内存的大小 每当我将指针传递给某个函数时 我还必须传递大小 即 10 个元素的数组需要接收 10 作为参数才能知道数组的大小 但我不必将大小传递给免费功
  • AngularJS 对跨源资源执行 OPTIONS HTTP 请求

    我正在尝试设置 AngularJS 与跨域资源进行通信 其中提供模板文件的资产主机位于不同的域中 因此 Angular 执行的 XHR 请求必须是跨域的 我已为 HTTP 请求添加了适当的 CORS 标头到我的服务器 以使其工作 但它似乎不
  • 为什么 Serverless 在尝试打包或部署时会产生无效的跨设备链接错误?

    运行任一命令时 sudo serverless package or sudo serverless deploy 我得到以下回溯 错误 错误 异常 回溯 最近一次调用 文件 var lang lib python3 6 shutil py
  • WCF,发布 JSON 化数据

    我有一个复杂的类型 DataContract public class CustomClass DataMember public string Foo get set DataMember public int Bar get set 然
  • 计算用于定义二次贝塞尔曲线分段的参数

    我有一条二次贝塞尔曲线 描述为 startX startY 到 anchorX anchorY 并使用控制点 controlX controlY 我有两个问题 1 我想根据 x 点确定该曲线上的 y 点 2 然后 给定贝塞尔曲线上的线段 由
  • 如何在 Django 模板中声明变量

    如何在 Django 1 8 模板中声明变量 例如 my var My String 这样我就可以像这样访问它 h1 trans my var h1 Edit 为了证明我的目的 这是我的代码 my var String Text block
  • 使用 SetParameters.xml 通过 powershell 将网站发布到 Azure

    是否有机会使用 SetParameters xml 文件在 Web 部署包中设置参数 我想通过 powershell 脚本和 cmdlet 部署应用程序 选择 Azure订阅 发布 AzureWebsiteProject 但我还没有找到如何
  • 在 Python 版本 3.10 上使用 pip3 在 M1 Mac 上安装 numpy 时出现“不兼容的架构(具有 'arm64',需要 'x86_64')”错误

    我试图使用 pip3 在 M1 Macbook 上安装 numpy 版本 1 22 3 pip3 表示该包存在 但是当我尝试导入该模块时 会向我抛出一个错误 提示我 Importing the numpy C extensions fail
  • 如何中途开始测量?

    在我的赞美诗中 我需要从中间开始第一小节 它的拍值是 3 4 但我必须插入两个空的 不显示的八分音符 我怎么做 我用过o4 o4 c8 d 下面是第一个措施 但 lilypond 不喜欢这样 正确的方法是什么 这是该行 o4 o4 c8 d
  • 使用 opencv 构建自定义 svm 内核矩阵

    我必须训练支持向量机模型 并且我想使用自定义内核矩阵 而不是预设的矩阵 如 RBF Poly 等 我怎样才能用opencv的机器学习库做到这一点 如果可能的话 谢谢你 AFAICT OpenCV 不直接支持 SVM 的自定义内核 看起来 L
  • 返回所有小于 M 的素数

    给定一个整数 M 返回所有小于 M 的素数 给出一个尽可能好的算法 需要考虑时间和空间复杂度 埃拉托斯特尼筛法是一个很好的起点 http en wikipedia org wiki Sieve of Eratosthenes
  • Java 最终字段值的“最新”保证是否扩展到间接引用?

    Java 语言规范定义了 Final 字段的语义第17 5节 Final 字段的使用模型很简单 在对象的构造函数中设置该对象的最终字段 在对象的构造函数完成之前 请勿将对正在构造的对象的引用写入其他线程可以看到的位置 如果遵循这一点 那么当
  • Laravel 如何制作自定义验证器?

    我需要制作自己的扩展验证器Illuminate Validation Validator 我读过这里的答案中给出的示例 Laravel 4 中的自定义验证 但问题是它没有清楚地展示如何使用自定义验证器 它不会显式调用自定义验证器 您能给我一
  • 如何通过DDP(WebSocket)协议访问meteor.com上托管的应用程序?

    我有一个Meteor app A和另一个应用程序B 不使用 Meteor 而是与应用程序进行一些数据交换A 当我启动时它工作正常A在我的本地网络中的一台计算机上 但是当我将其部署在meteor com 托管上时 它却没有 服务器没有回复 B
  • 如何调用 CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer?

    我正在想办法如何称呼这个AVFoundationSwift 中的函数 我花了很多时间摆弄声明和语法 才走到这一步 编译器大部分都很高兴 但我还有最后一个难题 public func captureOutput captureOutput A
  • 我可以通过placement-new覆盖const对象吗?

    基本生活 8告诉我们 我们可以在一个对象的生命周期结束后 使用它占用的存储空间来创建一个新的对象 并使用它的原始名称来引用它 除非 原始对象的类型不是 const 限定的 并且 如果是类类型 则不包含任何类型为 const 限定的非静态数据