在 C++ 中放置新的派生基子对象

2024-03-23

是否定义了放置新派生类的可简单破坏的基础对象的行为?

struct base { int& ref; };
struct derived : public base {
    complicated_object complicated;
    derived(int& r, complicated_arg arg) :
            base {r}, complicated(arg) {}
};

unique_ptr<derived> rebind_ref(unique_ptr<derived>&& ptr,
                               int& ref) {
    // Change where the `ref` in the `base` subobject of
    // derived refers.
    return unique_ptr<derived>(static_cast<derived*>(
        ::new (static_cast<base*>(ptr.release()) base{ref}));
}

请注意,我尝试构建rebind_ref为了不破坏编译器可能做出的任何严格的别名假设。


不可以,C++ 标准不允许这样做,至少有两个原因。

有时允许将新对象放置到另一个相同类型对象的存储中的文本可以在[基本生活],第 8 段 http://eel.is/c++draft/basic.life#8。粗体强调是我的。

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

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

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

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

  • [C++17] 原始对象是最派生对象类型的T并且新对象是该类型的最派生对象T(也就是说,他们是不是基类子对象).

  • [C++20 草案 2018-10-09]原始对象和新对象都不是潜在重叠的子对象([介绍.对象])。

C++20 的更改是考虑到零大小非静态数据成员的可能性,但它仍然排除了所有基类子对象(空或非空)。 “潜在重叠子对象”是一个新术语,定义于[介绍对象]第 7 段 http://eel.is/c++draft/intro.object#7:

A 潜在重叠的子对象或者是:

  • 基类子对象, or

  • 声明的非静态数据成员no_unique_address属性([dcl.attr.nouniqueaddr])。

(即使您确实找到了某种方法来重新安排事物以避免引用成员和基类问题,请记住确保没有人可以定义const derived变量,例如通过将所有构造函数设为私有!)

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

在 C++ 中放置新的派生基子对象 的相关文章

随机推荐

  • Python dict.get(k) 即使键存在也不返回任何内容

    可能是我对python的字典理解不太好 但问题就在这里 有没有发生过这样的情况 yolk shell pair exists字典里说eggs but a eggs get yolk 可以返回None 所以 在一个大的代码中 我做了多个get
  • 如何从首选项屏幕打开 AlertDialog?

    我的活动如下 import android app AlertDialog import android content DialogInterface import android content Intent import androi
  • 角度构建错误:TypeError:无法读取未定义的属性“line”

    我突然面临生产构建失败错误 我正在运行这个命令 ng build prod 并出现以下错误 D a 1 s node modules clean css lib reader input source map tracker js 37 i
  • iODBC 在 Mac OSX 10.6.4 下不工作

    我已经通过包 http www iodbc org dataspace iodbc wiki iODBC 安装了 iODBC 并按照此处所述设置所有配置文件 http blog opensteam net past 2009 1 28 ra
  • Redis 批量插入 - 出错

    我正在努力追随Redis 批量插入 Redis http redis io topics mass insert with Redis https hub docker com redis 有点不对劲 root f7ca5eef4a4c r
  • 在 EC2 区域中传播 MongoDB

    我想在多个 Amazon EC2 区域中分发分片 复制的 MongoDB 设置 此流量是否已由 MongoDB 加密 或者我可以选择进行设置吗 或者亚马逊是否在其数据中心之间提供类似 VPN 的特殊连接 我昨天回答了一个关于 Apache
  • Rails UTF-8 响应

    我有一个在 Ruby 1 9 3 上运行的 Rails 3 2 应用程序 它返回存储在 MongoDB 数据库中的 JSON 数据 数据似乎正确存储在 mongo 中 例如 看name属性 id ObjectId 4f986cbe4c808
  • 在 Phantomjs + selenium 中启用 cookies

    我想登录amazons3 网址 https console aws amazon com iam home security credential https console aws amazon com iam home security
  • EF 代码优先迁移,DB 生成 GUID 密钥

    这个问题是单行的 如何在代码优先迁移中生成 EF ALTER TABLE DMS Forms ADD CONSTRAINT DF DMS Forms Id DEFAULT newid FOR Id GO 问题的更多细节 我要构建一个简单的表
  • 嵌套弹性框下方的“魔法”空白(不是填充或边距)

    Note Original title was White space below MUI Grid container which is not a padding or margin but this is not related to
  • 来自同一数据集的多个 ComboBox 控件

    我在 Windows 窗体上有 2 个 DropDownList 组合框 它们都从同一数据集 人员列表 填充 但它们具有不同的用途 项目经理 审阅者 如果我将它们的数据源都设置为数据集 它们都会绑定到数据集并同时更改 我是否遗漏了某些内容
  • 如何计算 RandomForestRegression 中的 MSE 标准?

    我现在使用 sklearn ensemble 中的 RandomForestRegressor 来分析数据集 并选择 mse 作为衡量分割质量的函数 但我不太清楚mse是如何计算的 有人可以在这里向我解释一下 用方程更好 或者为我提供一些参
  • UITableView deleteRowsAtIndexPaths 不删除行

    我在IB中设计了UIView 并在其上设计了UITableView 在视图控制器的 viewDidLoad 方法中 我初始化自定义 UITableViewContoller 并设置 dataSource 和委托 void viewDidLo
  • CSS 拉伸内容容器高度,如果空则太大则溢出[重复]

    这个问题在这里已经有答案了 我所拥有的是一个简单的结构container接下来是两个子元素 contentand footer footer有固定的高度并且content应填充剩余的空白空间 这很容易实现display table 但由于某
  • 获取 Facebook 个人资料图片

    我需要通过传递 ID 来获取任何人的 Facebook 个人资料图片 但我不需要使用 facebook API 或 Graph 任何其他东西 只是我需要提供带有该 id 的 url 是否可以通过这种方式获取个人资料图片 我在谷歌尝试过 但没
  • 根据条件添加或删除类

    我正在从元素的类中添加 删除类classList基于变量的真实性 然而 我这样做的方式似乎是一种迟钝的方式 if myConditionIsMet myEl classList add myClass else myEl classList
  • [Authorize] 失败后显示 404 错误页面

    我有一个操作想限制为仅角色 管理员 我是这样做的 Authorize Roles Admin public ActionResult Edit int id 手动进入 Controller Edit 1 路径后 我被重定向到登录页面 好吧
  • 如何在 PHP 应用程序中打印 mysql 中的行号

    我有一个 mysql 表需要在前端应用程序中显示数据以及行号 以下查询在 phpMyadmin 中完美运行 SET row num 0 SELECT row num row num 1 AS num INV DOS PTNAME BAL P
  • 为什么 Jenkins 中的 ClearCase UCM 插件无法找到任何基线?

    我正在尝试设置 Jenkins v1 47 来使用ClearCase UCM v1 1 2 插件 https wiki jenkins ci org display JENKINS ClearCase UCM Plugin 使用以下配置 名
  • 在 C++ 中放置新的派生基子对象

    是否定义了放置新派生类的可简单破坏的基础对象的行为 struct base int ref struct derived public base complicated object complicated derived int r co