gpt4 book ai didi

c++ - 为什么在已删除的默认构造函数旁边定义一个空拷贝构造函数会使空列表的值初始化失败?

转载 作者:行者123 更新时间:2023-12-03 10:04:56 24 4
gpt4 key购买 nike

简而言之,为什么下面的代码表现得像评论中描述的那样?

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++ 的人的一句话比我想象的要好。

最佳答案

没有 user-provided复制构造函数,A是一个集合。是的,即使我们删除了默认构造函数。这是addressed in C++20 .
所以,在 C++20 之前,A a{};aggregate initialization ,因此不使用已删除的构造函数。当您取消对复制构造函数的注释时,A不再是聚合,从而将聚合初始化变成 value initialization .所以初始化a将尝试调用已删除的构造函数。
为了从标准中推测初始化器的含义,通常从 [dcl.init]/16 开始。 .通过项目符号,我们可以发现初始化器的属性(当与相关类型的属性匹配时)将如何影响初始化发生的方式。

关于c++ - 为什么在已删除的默认构造函数旁边定义一个空拷贝构造函数会使空列表的值初始化失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65697453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com