c++ - 为什么在已删除的默认 ctor 旁边定义一个空的副本 ctor 会使空列表的值初始化失败?
问题描述
简而言之,为什么下面的代码表现得像评论中描述的那样?
struct A
{
A() = delete;
//A(const A&) {} // uncommenting this...
};
int main()
{
A a{}; // ... breaks this
//A(); // this fails in either case because of `A() = delete;` only
}
为了理解这一点,我应该查看标准的哪一部分(或至少是 cppreference 上的一页)?
但是,写A(const A&) = default;
而不是//A(const A&) {}
不会中断A a{};
。那这个呢?我认为根本原因是一样的,但是真正了解 C++ 的人的话比我想的要好。
解决方案
没有用户提供的复制构造函数,A
是一个聚合。是的,即使我们删除了默认构造函数。这是C++20 中解决的问题。
因此,在 C++20 之前,A a{};
是聚合初始化,因此不使用已删除的构造函数。当您取消注释复制构造函数时,A
不再是聚合,从而将聚合初始化转换为值初始化。所以初始化a
会尝试调用被删除的构造函数。
为了从标准中判断初始化器的含义,通常从[dcl.init]/16开始。通过项目符号,可以发现初始化程序的属性(当与相关类型的属性匹配时)将如何影响初始化发生的方式。
推荐阅读
- ios - iOS磁力计矢量具有意外值
- javascript - javascript无法获取数据索引的索引号
- flutter - 错误:ListView.builder 的 itemCount 和 itemBuilder 参数无效
- powershell - Powershell elasticsearch不起作用,缺少scrollId
- android - ViewPager2 中 RecyclerViews 和内部 RecyclerViews 的 RecyclerView setRecycledPool 和 recycleChildrenOnDetach
- python - Selenium Webdriver:使用部分 ID 查找元素的 Xpath 无效
- javascript - 赛普拉斯:是否可以使用 cy.route 在其请求正文中删除具有特定路径的请求?
- c++ - 指向类成员函数的函数指针与任意函数指针之间的区别
- php - 将 CMYK PDF 转换为 RGB JPG 全黑
- flutter - 为什么我不能在颤动中更改凸起按钮的宽度和高度属性?