constexpr 用于派生类中空初始化的构造函数

2023-12-03

我有类似以下内容

class Base {
public:
    explicit Base(int* i) noexcept { type = new int; *type = *i; };
    constexpr Base(std::nullptr_t) : type(nullptr) { };
    ~Base() { cout << "Destroying!" << endl; delete type; };
protected:
    int* type;
};


class Derived : public Base {
public:
    explicit Derived(int* i) noexcept : Base(i) { };
    //constexpr Derived(std::nullptr_t) : type(nullptr) { };
    //constexpr Derived(std::nullptr_t) : Base(nullptr) { };
    ~Derived() { };
};

我想实现一些目标constexpr派生类的 null 构造函数,但编译器对这两个选项和我所做的类似测试抱怨很多。

当然,代码更复杂,我有一个不透明的处理程序,析构函数应该以更复杂的方式运行。资源释放总是相同的(不需要多个析构函数,只需要Base one).

我不知道如何实现这一点,也许我正在走一条错误的道路?有任何想法吗?我希望能够做类似的事情:

Derived a(nullptr);
Derived b(handler1);
Base c (nullptr);
Base d (handler2);

并且,在清理过程中,两者handler1 and handler2以某种方式进行管理。

Edit:

Clang(3.4 版)抱怨:

error: constexpr constructor never produces a constant expression [-Winvalid-constexpr]

并且 gcc (版本 4.8 [编辑:多个版本,尚未检查全部])在使用时不会抱怨

constexpr Derived(std::nullptr_t) : Base(nullptr) { };

实际上,gcc似乎做了我想要实现的目标,但我不明白constexpr足以知道哪个编译器做得正确以及我如何修改问题。


常量表达式的类型必须是文字类型。事实上,“文字类型”分类单元的全部目的是“成为可以作为常量表达式的东西”。请参阅[expr.const]:

A 条件表达式 e是一个核心常量表达式,除非计算e遵循抽象机 (1.9) 的规则,将计算以下表达式之一:

...

— 调用除文字类的 constexpr 构造函数,一个 constexpr 函数,

...

因此,一个constexpr构造函数只允许您在文字类上生成常量表达式,否则,正如编译器告诉您的那样,它将“永远不会生成常量表达式”。

文字类受 [basic.types] 的约束如下:

类型是一个文字类型如果是:

...

— 具有以下所有属性的类类型(第 9 条):

  • 它有一个简单的析构函数,
  • 它是一种聚合类型(8.5.1)或至少有一个constexpr构造函数或构造函数模板不是复制或移动构造函数,并且
  • 它的所有非静态数据成员和基类都是非易失性文字类型。

但是,从 C++14 开始(特别是从N3652), constexpr构造函数还有另一个不相关的用途:它们允许静态初始化(在 [basic.start.init] 的意义上):

A 常量初始值设定项对于一个物体o是一个表达式,它是 常量表达式,除了它也可以调用constexpr构造函数o及其子对象,即使这些对象属于非文字类类型 [Note:这样的类可能有一个不平凡的析构函数 -end note].

回顾一下:从 C++14 开始,constexpr有两个用途:

  1. C++11 解释:“常量表达式”是与其值相同的表达式(即其计算没有副作用);constexpr变量只是其值的占位符,并不用于其对象标识,并且通常期望常量表达式可以自由地替换为其(编译时已知的)值。

  2. C++14constexpr函数,包括构造函数:这些函数(包括构造函数)可以在静态初始化阶段调用,以对具有静态存储持续时间的变量进行常量初始化。如果变量是对象,它们仍然保留其对象标识,并且可能需要动态销毁,但它们的初始化发生在任何动态初始化之前,并且不受排序的影响。

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

constexpr 用于派生类中空初始化的构造函数 的相关文章

  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • 模板类的模板构造函数的 C++ 显式模板特化

    我有一个像这样的课程 template
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2

随机推荐

  • 释放NSTimer的正确方法?

    在我的 dealloc 方法中释放 NSTimer 的正确方法是什么 它是用以下代码创建的 void mainTimerLoop mainTimer NSTimer scheduledTimerWithTimeInterval 1 10 t
  • Eclipse Luna:未调用处理程序的 @CanExecute 方法

    我在 Eclipse Luna RCP 中的命令处理程序遇到问题 在我的 E4 应用程序模型中 我定义了一些必须启用的命令和相关处理程序 仅在某些情况下 因此 在我的处理程序 POJO 中 我实现了 注释为的方法 CanExecute我在其
  • MySql 查询-日期范围内的日期范围

    我使用 mySql 5 和 IIS I have products 有一个start date场和一个end date field 我需要运行一个查询 该查询将获取用户输入的开始日期和结束日期 并输出产品在日期范围内运行的天数 Exampl
  • 列表上的哈希函数与其中项目的顺序无关

    我想要一个为一组整数分配值的字典 例如key is 1 2 3 and value会有一定的价值 事情是这样的 3 2 1 在我的情况下需要进行相同的处理 因此如果我采用散列方法 散列需要相等 该套装将包含 2 至 10 件物品 项目的总和
  • 尝试每 x 秒执行一次文件

    请查找每 10 秒重复一次的更新代码 然而问题是它每 10 秒在屏幕上创建一个新的 GUI 而不是每 10 秒只更新数据 请你给个建议 package learningfromscrach import java awt import ja
  • 使用 timepicker.js 时“timepicker 不是函数”?

    我正在尝试使用此插件将时间选择器放入表单中 http jonthornton github io jquery timepicker 看起来我所要做的就是下载库并使用 jQuery 和 jQuery ui 但到目前为止我无法让它工作 即使
  • 查找具有最大可能总和的子矩阵 O(n^2)

    我正在尝试用 Java 编写一个程序 当给定一个 MxN 矩阵时 它将找到具有最大数字和的 连续 子矩阵 然后程序需要返回子矩阵的左上角坐标和右下角坐标 矩阵可以包含负数 并且矩阵和子矩阵都不需要是正方形 我看到这里讨论了这个问题 获取总和
  • Swift 中的 URL 验证

    在我的 Swift iOS 项目中 我想在请求服务器之前检查 url 是否有效 我之前在 Objective C 代码中检查了许多元素 例如 www http https 等是否存在 以验证 url 是否正确 Swift 代码中有类似的东西
  • 微调预训练的 word2vec Google 新闻

    我目前正在使用在 Google 新闻语料库上训练的 Word2Vec 模型 来自here 由于仅在 2013 年之前对新闻进行训练 因此我需要更新向量 并根据 2013 年之后的新闻在词汇表中添加新单词 假设我在 2013 年之后有一个新的
  • 为什么移动 0 会截断小数?

    我最近发现了这段JavaScript代码 Math random 0x1000000 lt lt 0 我知道第一部分只是生成 0 到 0x1000000 16777216 之间的随机数 但第二部分似乎很奇怪 执行位移 0 有何意义 我不认为
  • 如果我从共享扩展打开包含应用程序,Apple 会拒绝吗?

    我正在使用提供的解决方案here从共享扩展中打开我的内容 尽管它很脆弱 但它似乎没有使用任何私有 API 方式来做到这一点 如果我使用我的应用程序 Apple 会拒绝它吗 有人拥有经过批准的应用程序 可以从共享扩展中打开包含应用程序的应用程
  • MySQL:截断表与从表中删除

    我们什么时候使用DELETE命令与TRUNCATE命令 我试图在互联网上查找 但两个命令都删除了数据 我看不出有什么区别 从表中删除 1 DELETE is a DML Command 2 DELETE statement is execu
  • F# 返回 ICollection

    我正在使用用 C 创建的库 我一直致力于将一些代码移植到 F 但必须使用 C 库中的相当多的基础类型 一段代码需要计算一个值列表并将其分配给类中的公共字段 属性 该字段是一个包含两个 ICollection 的 C 类 我的 F 代码工作正
  • 如何从 com.google.api.client.googleapis.json.GoogleJsonResponseException 上失败的 Cloud Dataflow 作业恢复: 410 Gone

    我的 Cloud Dataflow 作业在运行 4 小时后神秘地失败 因为工作人员抛出此异常四次 在一小时内 异常堆栈看起来像这样 java io IOException com google api client googleapis j
  • 当代码发生更改时,Visual Studio 2010 在运行前不会生成

    多年来我一直使用 F5 开始调试 来构建代码 如果它已经过时 然后进行调试 这也适用于 VS 2010 但是今天它只是在没有构建的情况下开始调试 假设我对项目进行了清理 然后按 F5 而不是构建它 以便它可以运行 它会抛出一条错误消息 指出
  • Angular 4 Form FormArray 添加按钮以添加或删除表单输入行

    我正在使用 Angular 4 0 2 构建一个应用程序 如何向表单添加按钮以添加新的输入行和删除按钮以删除特定行 我的意思是我想要一个像这样的表格 我希望我的表格看起来像这样 这是我的代码 添加发票 component html h3 c
  • 无法修改iframe的内容,什么问题?

    我正在尝试修改 iframe 的内容 但它不起作用 这是我的 main html h3 Main page h3
  • 为什么枚举与 Windows 中的位字段不兼容?

    我正在研究 Windows 和 Linux 的 EBDS 协议接口 我试图将协议所需的所有数据打包到结构中 然后将结构本身和所有其他内容写入串行端口 将其发送到设备 协议的第一部分是数据打包 其中一个包的部分是与以下描述相匹配的控制字节 B
  • 在 C++ 中扩展数组时出现问题

    我正在为课堂编写一个模拟 其中一部分涉及生物体的繁殖 我的生物体被保存在一个阵列中 当它们繁殖时我需要增加阵列的大小 因为我有多个生物体的多个类 所以我使用了一个模板 template
  • constexpr 用于派生类中空初始化的构造函数

    我有类似以下内容 class Base public explicit Base int i noexcept type new int type i constexpr Base std nullptr t type nullptr Ba