聚合初始化不支持构造函数访问[重复]

2024-03-06

鉴于下面的示例,我惊讶地发现,尽管默认构造函数被显式删除(或为此设置为默认值),但聚合初始化仍然是可能的。

#include <iostream>

struct DefaultPrivate
{
      const int n_;
      static const DefaultPrivate& create();

    private:
      DefaultPrivate() = delete;
};

const DefaultPrivate& DefaultPrivate::create()
{
    static DefaultPrivate result{10};
    return result;
}

int main() {
    DefaultPrivate x; //Fails
    DefaultPrivate y{10};//Works
    return 0;
}

标准中是否未指定私有默认(或删除)构造和聚合初始化之间的关系?

GCC 6.3 和 VCC 2017 都是这种情况

我问这个问题的原因是我希望更改对默认构造函数的访问会阻止公共聚合初始化


从 C++11 开始,对于列表初始化 http://en.cppreference.com/w/cpp/language/list_initialization,

If T是聚合类型,则执行聚合初始化。

并使用 C++11总计的 http://en.cppreference.com/w/cpp/language/aggregate_initialization是以下类型之一:

...

类类型(通常是结构或联合),具有

  • ...

  • 没有用户提供, inherited, or explicit (since C++17)构造函数(explicitly defaulted or deleted constructors are allowed) (since C++11)

  • ...

这意味着从 C++11 开始,显式删除构造函数的类仍被视为聚合类型,然后允许聚合初始化。

而效果是:

Each direct public base, (since C++17)数组元素或非静态类成员,按照数组下标/在类定义中出现的顺序,从初始化列表的相应子句中进行复制初始化。

请注意,对于DefaultPrivate y{10};,在上面的过程中根本不会考虑默认构造函数,那么它被声明为delete and private没关系。

顺便说一句:对于DefaultPrivate x; 默认初始化 http://en.cppreference.com/w/cpp/language/default_initialization被执行,

if T is a non-POD (until C++11)类类型,会考虑构造函数并针对空参数列表进行重载解析。调用所选的构造函数(默认构造函数之一)来为新对象提供初始值;

所以尝试使用默认构造函数,但它是deleteed 然后编译失败。

如果您使用聚合初始化,例如DefaultPrivate x{};,代码也可以正常工作;和n_值已初始化 http://en.cppreference.com/w/cpp/language/value_initialization(进而零初始化 http://en.cppreference.com/w/cpp/language/zero_initialization) as 0.

LIVE https://wandbox.org/permlink/IYdoChD5QIatuUZ1

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

聚合初始化不支持构造函数访问[重复] 的相关文章

随机推荐

  • 如何有效地编码/解码压缩的位置描述?

    我正在为日本象棋变体编写一个表库 为了索引表基数 我将每个国际象棋位置编码为整数 在编码步骤之一中 我对棋盘上棋子的位置进行编码 由于实际方法有点复杂 我就简单地解释一下这个问题 编码 在残局桌面中 我有 比方说 六个不同的棋子 我想将它们
  • 可空类型装箱/拆箱 - 为什么要这样实现?

    通过 C 从 CLR 中提取有关装箱 拆箱值类型的信息 关于装箱 如果可空实例不是null CLR 从可为 null 的实例中取出值并将其装箱 换句话说可空 值为5被装箱成盒装 Int32值为 5 关于拆箱 拆箱只是获取对装箱对象的拆箱部分
  • 关闭 Matplotlib 数据[重复]

    这个问题在这里已经有答案了 我正在使用 Matplotlib 和 MPLD3 创建可以在 html 页面中显示的图形 使用 django 目前 我的图表是根据从 csv 文件中提取的数据动态生成的 我经常在终端中收到此消息 运行时警告 已打
  • Android 唯一序列号

    我正在开发一个针对 Android 4 0 API 14 及更高版本的 Android 应用程序 我正在寻找每个设备唯一且永久存在的序列号 随设备一起死亡 恢复出厂设置后不会更改 我在网上找到了很多关于 Android 设备唯一标识符的结果
  • 使用 AppCompat 的 SearchView

    我在使用appcompat v7之前在Actionbar中实现了SearchView 但是当我想将 SearchView 与支持库 v7 一起使用时 它显示 null 异常 In style
  • 在C中编写位图文件头时出现问题

    我正在尝试使用 C 创建一个新的位图文件 这是 bmp 文件头的结构 define uint16 unsigned short define uint32 unsigned long define uint8 unsigned char t
  • 无法在 osx 优胜美地上制作枪图。未定义的符号

    我尝试在 os x yosemite 10 10 4 下制作 gnuplot 5 0 0 但出现错误 make Applications Xcode app Contents Developer usr bin make all recur
  • 了解 Cocoa 和 Objective-C 的引用计数

    我刚刚开始了解 Objective C 和 Cocoa 希望能够使用 iPhone SDK 我对 C 相当满意malloc and free概念 但 Cocoa 的引用计数方案让我相当困惑 有人告诉我 一旦你理解了它 它就会非常优雅 但我只
  • Rails:调用 .limit(5) 更改结果顺序

    我有一个搜索功能 基本上运行模型记录的有序列表 问题是每当我打电话时 search limit 5 结果的顺序与我调用时的顺序不同 search 这是我的一些方法 def self search server name pvp type i
  • 错误:您正在传递未定义的模块!请检查您传递给 i18next.use() 的对象

    由于上述问题 我的单元测试失败了 String ts import as i18n from i18next import initReactI18next from react i18next import BrowserLanguage
  • OSStatus NSOSStatusErrorDomain

    当我使用获取该属性时收到以下错误 AudioSessionGetProperty kAudioSessionProperty CurrentHardwareSampleRate size myAudioDescription mSample
  • 解析 1 TB 文本并有效计算每个单词出现的次数

    最近 我遇到一个面试问题 用任何语言创建一个算法 该算法应该执行以下操作 读取 1 TB 内容 对该内容中每个重复出现的单词进行计数 列出最常出现的 10 个单词 您能让我知道为此创建算法的最佳方法吗 Edit 好吧 假设内容是英文的 我们
  • 通过将一个变量拆分为多个变量来创建新列(在 R 中)

    我想通过分割数据框中的向量来创建新列 我有这样一个数据框 YEAR Variable1 Variable2 2009 000000 00000001 2010 000000 00000001 2011 000000 00000001 200
  • 在单例中使用删除的复制构造函数

    我已经实现了单例模式 例如this https stackoverflow com questions 270947 can any one provide me a sample of singleton in c 271104 2711
  • 在Golang中指定http请求的网络接口[重复]

    这个问题在这里已经有答案了 我使用 go 的 http 包来发出 http 请求 当 Ubuntu Linux 上有多个接口时 如何配置 go 的 http 客户端使用特定接口或 IP 地址来执行请求 默认的http客户端如何决定它使用哪个
  • 我应该如何将对象传递给函数?

    我是 C 编程新手 但我有 Java 编程经验 我需要有关如何在 C 中将对象传递给函数的指导 我是否需要传递指针 引用或非指针和非引用值 我记得在 Java 中不存在这样的问题 因为我们只传递保存对象引用的变量 如果您还可以解释在哪里使用
  • FirebaseAuth 禁用用户检查并注销?

    所以我有一个 onAuthStateChanged 流 我想检查用户是否已被 Firebase 控制台上的管理员禁用以注销用户并再次转到登录页面 这是我的流检查用户是否已登录 但是如何检查用户是否被 Firebase 控制台禁用 这是我的流
  • 如何在 iOS 9 中将 AVCaptureSession 与 Slide Over 和 Split View 结合使用?

    我的团队正在开发一套 SDK条码扫描 https github com pdf417 pdf417 ios 身份证扫描 https github com BlinkID blinkid ios and OCR https github co
  • 同时读取文件

    读取部分不是并发的 但处理是并发的 我这样表述标题是因为我最有可能使用该短语再次搜索此问题 我尝试后陷入僵局超越示例所以这对我来说是一次学习经历 我的目标是 逐行读取文件 最终使用缓冲区来执行行组 将文本传递给func 这确实有一些正则表达
  • 聚合初始化不支持构造函数访问[重复]

    这个问题在这里已经有答案了 鉴于下面的示例 我惊讶地发现 尽管默认构造函数被显式删除 或为此设置为默认值 但聚合初始化仍然是可能的 include