我可以通过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对象吗? 的相关文章

  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 在 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 限定的非静态数据