为什么要为具有重要析构函数的类声明 constrexpr 构造函数(例如 unique_ptr、std::variant)

2024-05-07

据我了解(至少对于c++14),析构函数不能是constexpr如果它不是微不足道的(隐式生成或=default)。声明的意义何在constexpr具有非平凡析构函数的结构的构造函数?

struct X {
  int a_;

  constexpr X(int a) : a_{a} {}

  // constexpr ~X(){}; // Error dtor cannot be marked constexpr
  // ~X(){}; // causes  error at y declaration: temporary of non-literal type ‘X’
             // in a constant expression .
};

template <int N> struct Y {};

int main() {
  Y<X{3}.a_> y; // OK only if the destructor is trivial
  (void)y;
}
// tested with c++14 g++-5.1.0 and clang++ 3.5.0

例如std::unique_ptr有一些构造函数 http://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr constexpr(默认和nullptr_t),即使析构函数显然是明确定义的(当然,如果对象是nullptr,但这是否意味着它仍然有一个显式定义的析构函数来检查对象是否处于空状态,正如我所见,即使是空析构函数也不允许在编译常量表达式)

另一个例子是提案标准::变体 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4542.pdf:它几乎拥有所有的构造函数constexpr尽管析构函数有签名~variant()它必须call get<T_j> *this).T_j::~T_j() with j being index().

我缺少什么?


constexpr构造函数可用于常量初始化,作为静态初始化的一种形式,保证在任何动态初始化发生之前发生。

例如,给定一个全局std::mutex:

std::mutex mutex;

在一致的实现中(阅读:不是 MSVC),其他对象的构造函数可以安全地锁定和解锁mutex, 因为std::mutex的构造函数是constexpr.

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

为什么要为具有重要析构函数的类声明 constrexpr 构造函数(例如 unique_ptr、std::variant) 的相关文章

随机推荐

  • 使用 Matplotlib 和系数绘制多项式

    我的代码是 import numpy as np import matplotlib as plt polyCoeffiecients 1 2 3 4 5 plt plot PolyCoeffiecients plt show 其结果是描述
  • OpenCV:视频结束后如何重新启动?

    我正在播放视频文件 但播放完毕后如何再次播放 Javier 如果您想一遍又一遍地重新启动视频 也称为循环播放 可以通过在帧数达到时使用 if 语句来实现cap get cv2 cv CV CAP PROP FRAME COUNT 然后重置帧
  • 带 % 的 Flask URL 参数未正确处理

    EDIT2 对于缺乏清晰度 我深表歉意 我将提供几个值 第一个是我使用前端应用程序调用的 URL 第二个是调用前的值urllib unquote 第三个是调用后的值urlib unquote 前端 console log http loca
  • SLF4J 日志记录到文件 vs. DB vs. Solr

    我需要一些关于 SLF4J 日志记录的建议 目前 我们正在为 Java Web 应用程序使用 SLF4J 日志记录 log4j 绑定 该应用程序使用简单的 ConsoleAppender 我们的下一步是研究可以保存日志的地方 我们的应用程序
  • JavascriptError:javascript 错误:等待结果时文档已卸载

    在使用 Protractor e2e 测试运行测试角度应用程序时 我目前面临一个问题 这是一个间歇性的问题 我收到 JavascriptError javascript错误 等待结果时已卸载文档 以下是日志 Failures 18 51 4
  • 我如何更改EditText光标旋钮颜色android(不是旋钮光标颜色)

    I am trying to change my EditText cursor knob but failing to see it on a device attached is my XML for this layout
  • 不同计算机上的 Android 设备之间的通信

    是否可以使 Eclipse 上的两个 Android 模拟器从通过快速以太网链路连接的两台不同机器进行通信 感谢您的回复 是的 传出端可以正常工作 但传入端 无论哪一个正在接收连接 都有点复杂 您可以设置模拟器或 adb 端口转发 但这只会
  • 重用 Java 方法的最佳方法

    我正在学习 Java 和 OOP 并且一直在做问题欧拉计划 http projecteuler net index php section problems用于练习 顺便说一句 很棒的网站 我发现自己一遍又一遍地做许多相同的事情 例如 检查
  • 电子在没有任何信息的情况下死亡,现在怎么办?

    我正在构建的应用程序 当我编译它以使用电子构建器打包它进行分发时 时不时地会死掉 显示空白屏幕和断开连接的开发工具 有什么想法或者如何开始弄清楚这里发生了什么吗 听听uncaughtException事件并记录您收到的任何错误 这将使您深入
  • Msil 以动态类型发出静态数组

    我正在尝试使用 Reflection Emit 在 c 中 创建一个新类型 我想要创建的代码类似于 public class public static int A new int 1 2 3 我首先尝试定义一个字段 然后设置它的值 var
  • 在 CSS 中指定后备字体大小?

    有没有办法指定不同的字体sizesCSS 中的后备字体 我想做这样的事情 这显然不起作用 div font family Arial Narrow Arial Helvetica sans serif font size 20px 18px
  • BigInteger 的困难

    我正在尝试使用递归和 BigInteger 进行阶乘 但 eclipse 抱怨 BigInteger 我知道这个程序应该很简单 但它让我头疼 这是代码 import java util Scanner import java math Bi
  • 使用 spring-java-config 创建“决策步骤循环”

    我正在尝试将 spring batch 作业 在 xml 中定义 移植到基于 java config 的作业 这是我的作业配置文件的片段
  • 在哪里可以找到并提交有关 Google Chrome 浏览器的错误报告?

    对于想要为 chrome 浏览器进行开发的开发人员来说 能够审查现有的错误 以避免太多的麻烦 并添加新的错误 以改进 是很重要的 但我似乎找不到该项目的错误跟踪 它is开源 对吗 谷歌正在称呼它Chromium http code goog
  • 内存地址是否指向一个字节的信息?

    以下是 DTS 文件的摘录 linux arch powerpc boot dts 板名 dts memory device type memory reg lt 0x00000000 0x40000000 gt 1GB at 0 嵌入式设
  • Feathers 中的任意响应内容类型

    我有一项自定义服务 必须以 CSV 格式返回数据 我无法使用标准 Express 路线 因为我需要在该端点上使用 Feathers 的钩子 我找不到返回非 HTML 非 JSON 数据的 Feathers 服务的示例 并且找不到指定响应内容
  • 如何查找出现在括号之间的所有单词?

    我有一个文件 其中包含括号中的一些单词 我想编制一个出现在那里的所有独特单词的列表 例如 This is some text This text has some words in parenthesis Sometimes there a
  • 在 osx 上安装 pycrypto 时出现问题

    我正在尝试将 Django 项目安装到我的 OSX 计算机上 这需要 PyCrypto 我收到以下错误 running install running build running build py running build ext run
  • 如何在Qt中设置编译器?

    我对 Qt 完全陌生 我下载了离线版本 Qt 5 3 2 for Windows 64 bit VS 2013 OpenGL 573 MB 我无法编译我的项目 I have Qt Creator 3 2 1 开源 基于Qt 5 3 2 MS
  • 为什么要为具有重要析构函数的类声明 constrexpr 构造函数(例如 unique_ptr、std::variant)

    据我了解 至少对于c 14 析构函数不能是constexpr如果它不是微不足道的 隐式生成或 default 声明的意义何在constexpr具有非平凡析构函数的结构的构造函数 struct X int a constexpr X int