带删除默认构造函数的类类型能否被默认初始化?
关于C++值初始化、默认初始化与列表初始化的困惑
最近看C++相关资料的时候,碰到了一个让我搞不懂的点,想请教一下:
首先看到关于值初始化的描述:
若T是无默认构造函数、或拥有用户提供的或被删除的默认构造函数的类类型,则对象被默认初始化(default initialization);
这里我就懵了——如果类的默认构造函数已经被删除了,那怎么还能完成默认初始化呢?毕竟按照我之前的理解,类类型的默认初始化是必须要访问默认构造函数的啊。
比如我写了这样一段代码:
struct A { A() = delete; int k; };
测试的时候发现:
A *a = new A;编译失败,这符合预期;A* a = new A();同样编译失败,也说得通;- 但
A a{};居然能正常编译通过,这就让我完全摸不着头脑了。
另外我还看到关于列表初始化的描述:
否则,若空的花括号初始化列表用于类类型T且T拥有默认构造函数,则执行值初始化。
这就更矛盾了,A明明没有可用的默认构造函数,为什么A a{};还能成功呢?
内容的提问来源于stack exchange,提问作者choxsword
相关产品推荐
相关产品推荐

