我鼓励这个问题:
如果我有
class A
{
public:
};
int main()
{
A a{};
A b{a};
}
海湾合作委员会给出:
move.cc:在函数‘int main()’中:
move.cc:15:7: 错误:“A”的初始值设定项太多
A b{a};
但是当我使用 A b(a) 而不是 A b{a} 时,所有编译都会正确。如果我声明默认构造函数,它也会编译。为什么会这样呢?
该类是一个聚合,因此列表初始化将执行聚合初始化,并且不会考虑隐式声明的构造函数。
由于没有数据成员,因此只有空列表才能成为有效的聚合初始值设定项。
但是当我使用A b(a)
代替A b{a}
全部编译正确。
直接初始化将使用隐式构造函数,而不是尝试聚合初始化。
如果我声明默认构造函数,它也会编译。
通过声明构造函数,类不再是聚合,并且只能使用构造函数来初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)