值初始化适用于原子对象吗?

2023-11-23

By work在这里,我的意思是std::atomic<T> a{}有效地进行零初始化a。我一直这么想,并且一直在实际使用它,直到this。在解释我对此的理解之前,我想表明,至少 gcc 和 clang 正在实践中这样做。

#include <cstring>
#include <atomic>
#include <iostream>

int main() {
  using atomic = std::atomic<int>;  
  auto p = (atomic*)operator new(sizeof(atomic));
  std::memset(p, -1, sizeof(atomic));
  new(p) atomic{};
  std::cout << p->load() << std::endl;
}

输出是0双方gcc and clang.

以下是我对为什么这应该有效的解释(当然,你可能不这么认为)。标准说

在以下操作定义中:

  • A 指原子类型之一。

[...]

A::A() noexcept = default;

Effects:使原子对象处于未初始化状态。 [注:这些语义确保与 C 的兼容性。-尾注]

它基本上说默认构造函数是微不足道的,什么也不做。我对此表示同意,但我不明白这如何使值初始化变得不适用。根据cppref,值初始化的影响包括(强调我的):

如果 T 是一个类类型,其默认构造函数既不是 用户提供或删除(也就是说,它可能是一个带有 隐式定义或默认的默认构造函数),对象是 零初始化,然后如果它有一个则默认初始化 非平凡的默认构造函数;

std::atomic有一个默认的默认构造函数,所以该对象是

  1. 零初始化,然后
  2. 如果它有一个重要的默认构造函数,则它是默认初始化的。

第 2 点在这里不适用,因为默认的默认构造函数很简单,但我没有看到任何使第 1 点无效的语句。我的理解正确还是我遗漏了什么?


最终,值初始化情况的关键在于[dcl.init]/7、项目符号 1 和 2:

对 T 类型的对象进行值初始化意味着:

  • 如果 T 是具有用户提供的构造函数 ([class.ctor]) 的(可能是 cv 限定的)类类型 (Clause [class]),则使用默认构造函数 for T 被调用(如果 T 没有,则初始化是错误的 可访问的默认构造函数);
  • T 是一个(可能是 cv 限定的)非联合类类型,没有用户提供的构造函数,则该对象是零初始化的,并且,如果 T 的隐式声明的默认构造函数并不简单,即 构造函数被调用。
  • ...

应用上面两个项目中的哪一个取决于用户提供的 c'tor。我在其他答案的评论中不记得的是错综复杂的= default;当应用于此时。如果我们看一下给出的定义[dcl.fct.def.默认]/4(强调我的):

显式默认函数和隐式声明函数是 统称为默认函数,并且实现应 为它们提供隐式定义([class.ctor] [class.dtor], [class.copy]),这可能意味着将它们定义为已删除。一个特别的 如果成员函数是用户声明的而不是用户声明的,则该成员函数是用户提供的 明确默认或在第一次声明时删除。A 用户提供的显式默认函数(即显式 第一次声明后默认)定义在以下位置 它是明确默认的;如果这样的函数是隐式定义的 删除后,该程序格式不正确。 [ 注意:将函数声明为 第一次声明后默认可以提供高效的执行 和简洁的定义,同时启用稳定的二进制接口 不断发展的代码库。 ——尾注]

我们看到默认的c'toratomic 不是用户提供的,因为它被声明为默认,而不是先声明然后定义为默认。因此 [dcl.init]/7 的第二个项目符号是适用的,该对象被零初始化,然后是(非)调用(简单的默认)构造函数,该构造函数不执行任何操作。

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

值初始化适用于原子对象吗? 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐