nullptr_t 是默认的可构造类型吗?

2024-03-10

我无法从 C++11 标准判断 nullptr_t 是否有默认构造函数。换句话说,以下内容有效吗?:

nullptr_t n; 

GCC 和 VC++ 允许上述代码,但 clang 不允许。我在标准中找不到任何内容指定它没有默认构造函数,而我能找到的内容表明它应该有。这对我来说很重要,因为我正在为较旧的编译器支持编写 nullptr 的基本后备实现,并且需要知道是否需要为其提供默认构造函数。


标准的内容

标准说(18.2)

nullptr_t 定义如下:

namespace std {
   typedef decltype(nullptr) nullptr_t;
}

nullptr_t 为其同义词的类型具有 3.9.1 中描述的特征和 4.10.

3.9.1 基本上说它的大小应该与void*4.10 规定了转换规则nullptr.

Edit:3.9.9 还明确指出nullptr_t是标量类型,这意味着 8.5 中内置类型的预期初始化规则适用:

  • 默认初始化 (nullptr_t n;),剩下的值为n不明确的。正如 Johannes Schaub 正确指出的那样,这可以与最新版本的 Clang 很好地编译。
  • 值初始化 (nullptr_t n = nullptr_t();),将 n 初始化为 0。

此行为与例如相同int, so nullptr_t绝对是默认可构造的。 这里有趣的问题是:这意味着什么nullptr_t具有未定义的值?归根结底,只有一个有意义的可能值nullptr_t,即nullptr。此外,类型本身仅通过语义来定义nullptr文字。这些语义是否仍然适用于未初始化的值?

为什么这个问题在实践中并不重要

您不想声明类型的新变量nullptr_t。该类型唯一有意义的语义已经通过nullptr字面量,因此每当您使用类型的自定义变量时nullptr_t,你也可以使用nullptr.

实践中重要的是什么

唯一的例外是您可以采用类型的非类型模板参数nullptr_t。对于这种情况,了解哪些值可以转换为很有用nullptr_t,在 4.10 中描述:

空指针常量是整数类型的整型常量表达式 (5.19) 纯右值,其计算结果为零或类型的纯右值std::nullptr_t。 [...] 整型的空指针常量可以转换为类型的纯右值std::nullptr_t.

这基本上就是你所期望的:你可以写

nullptr_t n = 0;    // correct: 0 is special

but not

nullptr_t n = 42;   // WRONG can't convert int to nullptr_t

gcc 4.6 和 Clang SVN 都做到了这一点。

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

nullptr_t 是默认的可构造类型吗? 的相关文章

随机推荐

  • 如何使用最新版本的 R RDCOMClient 从 Outlook 发送邮件?

    当我使用最新版本的 R RDCOMClient 包发送 Outlook 电子邮件时 它显示错误 相同的代码 library RDCOMClient init com api OutApp lt COMCreate Outlook Appli
  • 通过spring AOP + Aspectj进行异常处理

    在我的项目中 我有一个域层 它基本上是 POJO 和一个位于域层之上的 Spring 控制器 服务层 我还有一个位于服务和域之间的 AOP 层 我的域层正在抛出业务异常 这些异常现在正在服务层中处理 但是我想更改它 以便从领域层抛出的异常将
  • Backbone.js 视图的合适粒度是多少?

    我正在采用 Backbone js 来渲染一个小角落现有的大型网络应用程序 http www esvonline org 如果进展顺利 我可以看到 Backbone js 不断发展以涵盖整个应用程序 为有机增长的应用程序提供一些急需的结构
  • 了解Scheme函数

    我们的编程语言练习考试中给出了以下问题 我很难理解它是如何工作的 有人能告诉我代码流程是什么吗 我已经在球拍中运行过它并且知道答案是什么 看起来第一个 lambda 函数将其他两个函数作为参数 但输入在哪里 lambda x 2 and l
  • 在 C 中创建字符串的宏

    替代标题 以帮助搜索 将预处理器标记转换为字符串 我怎样才能从一个字符串C宏的价值 原始问题 我想用C define在编译时构建文字字符串 该字符串是因调试 发布等而更改的域 我想做这样的事情 ifdef TESTING define IV
  • 是否有 Perl 模块可以连接 Google Contacts API?

    我想编写一个命令行程序来将联系人添加到 GoogleMail WWW 联系方式 Google联系方式 http search cpan org dist WWW Contact GoogleContactsAPI似乎只能从 Google 获
  • 多核机器上 .NET 操作的非线性扩展

    我在 NET 应用程序中遇到了一种奇怪的行为 该应用程序对一组内存数据执行一些高度并行的处理 当在多核处理器 IntelCore2 Quad Q6600 2 4GHz 上运行时 它会在启动多个线程来处理数据时表现出非线性扩展 当在单核上作为
  • Wix升级:预选功能

    我们使用 Wix 来创建我们的安装程序 我们使用的用户界面可以选择需要安装的功能 某些功能默认启用 其他功能则禁用 但是 当我们运行升级时 这些默认值将被保留 我们希望安装程序记住安装了哪些功能 并在功能树中启用它们以进行升级 应禁用所有其
  • Railsinstaller 遇到问题

    我在 Windows 8 笔记本电脑上遇到了 Railsinstaller 问题 这是由于无法使用以下命令在 项目 目录中运行服务器rails s命令 但是与许多教程相反 我每次都会收到这个命令 C Sites demo gt rails
  • 商业产品中的 JavaFX [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用 JavaFX 作为大型商业产品的开发框架 我可以在不违反 Oracle 许可的情况下关闭未来产品的源代码并使用 Oracle JavaFX
  • 我想显示第一个列表中的第一个单词并显示第二个列表中的 10 个单词,依此类推-python。我尝试使用 range 和 zip。它仍然不起作用

    在这里 我正在创建一个名为 li 的列表 其中包含标签文本和名为 list2 的列表 其中包含 span 文本 我使用 zip 附加它 现在 我有一个名为 name 的第三个列表 它有 2 个值 最活跃者 增益者 我想要 Mostactiv
  • 在 dataclasses.field 中使用显式 __init__ 构造函数和 default_factory 参数时,数据类属性丢失

    以下代码创建一个数据类Obj带有 int 字段n默认值为 0 from dataclasses import dataclass field dataclass class Obj n int field default factory i
  • scala:匹配对象的类型参数

    例如 如果我有一个接受 Type 参数的类Seq T 我有很多此类的对象 我想根据类型参数拆分它们T 例如 val x List Seq Int 1 2 3 4 5 6 7 8 9 0 Seq String a b c x foreach
  • 错误:管道的另一端没有进程

    我正在使用 SQL Server 2012 仅限本地主机 和 SQL Server Management Studio SSMS 来查看包含二进制值 图片 的表图片 大小为 928 行 大小并不大 只有那张桌子有问题 即使在重新启动 SQL
  • 如何在DataGridViewTextBoxCell和DataGridViewComboBoxCell之间切换?

    我想要一个有两列的 DataGridView 第一列始终为 DataGridViewComboBoxColumn 类型 根据该列中的选择 我希望能够将第二列中的相应单元格更改为 DataGridViewComboBoxCell 或 Data
  • CQRS、DDD同步报告数据库

    我们正在尝试 CQRS 和 DDD 以及事件溯源 假设我有一位客户更新了电子邮件地址 这会触发 CustomerUpdatesEmailAddress 事件 这会进入我的操作 写入数据库 并更新表 我们的系统设计为有一个运行的 ETL 流程
  • 有没有办法在 F# 中通过字符串获取记录字段?

    我想通过用字符串查找来获取记录中字段的值 type Test example string let test example this is the value let getByName s string something like t
  • 使用 pd.concat 时添加标识原始数据框的列

    我有一个数据框字典 如下所示 test df1 pd DataFrame col1 3 5 1 4 col2 3 5 1 4 df2 pd DataFrame col1 3 5 1 4 col2 3 5 1 4 df3 pd DataFra
  • lit-element Web Components 和 React 之间的主要区别[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 查看 React 代码 它似乎与 Lit Element 代码更相似 两者都可以用于创建 Web 组件
  • nullptr_t 是默认的可构造类型吗?

    我无法从 C 11 标准判断 nullptr t 是否有默认构造函数 换句话说 以下内容有效吗 nullptr t n GCC 和 VC 允许上述代码 但 clang 不允许 我在标准中找不到任何内容指定它没有默认构造函数 而我能找到的内容