为initializer_list提供私有构造函数是否符合要求?

2023-11-25

该标准草案显示了以下内容的概要:initializer_list。它没有私有构造函数。

https://i.stack.imgur.com/5bc61.png

但我看过的两个标准库实现 libstdc++ 和 libc++ 都提供私有构造函数:

  // The compiler can call a private constructor.
  constexpr initializer_list(const_iterator __a, size_type __l)
  : _M_array(__a), _M_len(__l) { }

_LIBCPP_ALWAYS_INLINE
_LIBCPP_CONSTEXPR_AFTER_CXX11
initializer_list(const _Ep* __b, size_t __s) _NOEXCEPT
    : __begin_(__b),
      __size_(__s)
    {}

我相信这个私有构造函数“隐含”的部分源于§8.5.4/5:

类型的对象std::initializer_list<E>是由一个 初始化列表就像实现分配了一个临时数组一样 的N类型元素const E, where N是元素的数量 在初始化列表中。该数组的每个元素是 使用初始化器的相应元素进行复制初始化 列表,以及std::initializer_list<E>对象被构造为 引用该数组。

所以我的问题是:

  • 剧情简介是否不够详细?

  • 库需要私有构造函数吗?它做了哪些编译器不能做的事情?


剧情简介是否不够详细?

不,它记录了面向用户的部分initializer_list类模板,您实际上可以在代码中使用的部分。根据概要,模板仅包含一个默认构造函数,允许您创建空initializer_lists,这显然不是很有用。然而,initializer_list<T>是一种依赖于某些的类型magic由编译器完成。神奇的是,我指的是您引用的§8.5.4/5。这使得下面的语句合法并且可以编译。

std::initializer_list<int> numbers{1, 2, 3, 4}; // no such constructor in the synopsis

这里,如§8.5.4/5中所述,编译器将创建一个包含四个整数的数组,然后初始化initializer_list<int>具有一对指针(第一个元素和一个超过结束元素)或一个指针和长度(这就是 libstdc++ 和 libc++ 似乎所做的)的实例。

创建实例后,您的代码就可以访问概要中列出的所有成员函数。

库需要私有构造函数吗?它做了哪些编译器不能做的事情?

正如 libstdc++ 私有构造函数定义上面的注释所暗示的那样,编译器能够发出绕过正常访问控制的代码,所以不,我想说拥有该构造函数并不是必需的。编译器可以使用默认构造函数来构造一个空的initializer_list实例,然后为私有数据成员分配适当的值(这些也没有在概要中列出,但是必要的)。

但是,当私有构造函数提供编译器可以调用的干净接口时,为什么要为这种笨拙而烦恼呢?

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

为initializer_list提供私有构造函数是否符合要求? 的相关文章

随机推荐

  • pandas 数据框,按值复制

    我注意到我的程序中存在一个错误 它发生的原因是因为 pandas 似乎是通过引用而不是通过值复制 pandas 数据框 我知道不可变对象总是通过引用传递 但 pandas 数据帧不是不可变的 所以我不明白为什么它通过引用传递 有人可以提供一
  • Inno Setup,[Run] 中的空格和双引号

    我正在尝试在 Windows 上安排任务 但不幸的是 它不起作用 任务已创建 但不正确 当我查看任务的参数时 它说 PROGRAM C Program ARGUMENTS Files x86 AppName executable exe 我
  • C++11 中的命名空间问题?

    有人可以解释一下以下内容吗 cat test cpp include
  • 使用 LinkMovementMethod 时可以禁用 TextView 中的滚动吗?

    我在 textView 中使用可点击范围来仅允许部分文本可点击 它工作正常 只是 textView 向下滚动 这是我不想要的 发生这种情况是因为我使用 LinkMovementMethod 在需要时滚动 有没有办法取消滚动 Spannabl
  • 使用 Javascript 播放 HTML5 视频 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我该如何使用JavaScript播放 HTML5
  • 作为“本地系统”运行 Windows 服务有哪些安全风险?

    我编写了一个作为 本地系统 运行的 NET Windows 服务 最近我读到 作为本地系统运行可能会将系统凭据暴露给黑客 使他们能够接管系统 当我作为本地系统运行服务时 涉及哪些风险以及如何预防这些风险 服务运行为LocalSystem是系
  • kubernetes 部署-容器未启动-错误- InvalidImageName

    以下是 Kubernetes 部署 yaml 文件 container图片部分 image https registry ng bluemix net test service test branch 67 imagePullPolicy
  • PHP basename() 和 pathinfo() 与多字节 UTF-8 文件名

    我发现 PHP 函数 basename 以及 pathinfo 对于多字节 utf 8 名称有奇怪的行为 它们删除所有非拉丁字符 直到第一个拉丁字符或标点符号 但是 此后 后续的非拉丁字符将被保留 basename x returns x
  • 是否可以使用 MongoDB 作为嵌入式数据库?

    正如标题所示 我喜欢将 MongoDB 服务器嵌入到我自己的 C 应用程序中 我在文档中没有找到这种模式 我正在寻找类似 SQLite 或 Firebird 的嵌入式模式 MongoDB 也可以实现这一点吗 无需自己编程 目前还没有办法嵌入
  • 为什么 json_decode 对于空数组返回 null?

    为什么这会回显 NULL 在我看来 它将被解码为一个空数组 我明显缺少什么吗 这是因为array NULL 在这种情况下 它不检查对象类型 gettype null 返回 null 而 gettype array 返回数组 希望你能明白其中
  • 在 python 中保存和处理内存中的大字典的有效方法

    正如我做了一些测试 一个包含 3000 万个项目的 int gt int 不同值 的 python 字典可以轻松地占用我的 mac 上 gt 2G 的内存 由于我只使用 int 到 int dict 有没有比使用 python dict 更
  • VSCode 如何自动插入 Intellisense 建议而无需按 Enter?

    默认 VS Code 智能感知行为 向用户呈现建议菜单 User then has to press the Up or Down arrow keys to navigate through the menu Finally user h
  • MPI_SEND 占用虚拟内存的很大一部分

    在大量内核上调试我的程序时 我遇到了非常奇怪的错误insufficient virtual memory 我的调查导致了代码的和平 主站向每个从站发送小消息 然后我写了一个小程序 其中 1 个 master 只需发送 10 个整数MPI S
  • 在 .net 4.5 中使用 ClientWebSocket 时如何设置 User-Agent 和 Referer 标头?

    使用的明显答案ClientWebSocket SetHeader抛出异常 因为它是受保护的标头 System ArgumentException occurred Message The User Agent header must be
  • 如何检查列表中是否存在子序列? [复制]

    这个问题在这里已经有答案了 在Python中 可以使用is检查包含的关键字 例如 gt gt gt 3 in 1 2 3 4 5 True 但是 如果它检查单个整数的列表是否在引用列表内 则不会产生相同的输出 1 2 3 4 5 gt gt
  • 在不知道尺寸的情况下垂直居中图像

    我在网络开发生涯中集中了很多东西 但我想知道是否有一种简单的方法可以在不知道图像尺寸的情况下垂直居中图像 想象一下我从数据库中获得的缩略图列表 我不希望每个项目都粘在父 div 的顶部 div div img src path i got
  • 更改使用 Mono 运行的 C# 应用程序中的当前 Linux 用户?

    我正在为 Linux 系统开发一个库 CLI 程序集 我想为图书馆的用户提供一种切换当前有效用户和组的方法 主要原因是提供访问控制 某些操作仅允许某些用户允许 其次是允许特定用户修改文件系统 我已经确定了两种可能的方法 1 以 root 身
  • 即使已经安装了包,pip install 也总是克隆 git 存储库

    有没有办法让 pip 检查 git 指定的包是否已经安装并完全跳过 git 克隆 文档提到您可以在 Egg 定义之后指定版本 但这只是为了用户的视觉方便 并没有在任何地方使用 对于我的用例 解决方案是更改表单中的 URL git https
  • Ruby 正则表达式与 Python 正则表达式

    Ruby 正则表达式和 Python 正则表达式之间有什么真正的区别吗 我一直无法发现两者之间的任何差异 但可能错过了一些东西 我上次检查时发现 它们在 Unicode 支持方面存在很大差异 1 9 中的 Ruby 至少有一些非常有限的 U
  • 为initializer_list提供私有构造函数是否符合要求?

    该标准草案显示了以下内容的概要 initializer list 它没有私有构造函数 但我看过的两个标准库实现 libstdc 和 libc 都提供私有构造函数 The compiler can call a private constru