指定构造函数时不同的行为列表初始化



我有这样的代码,例如:

class A {
public:
int x;
A() {
std::cout << "Constructor Called !" << std::endl;
}
A(int y):x(y) {
std::cout << "Constructor Param Called !" << std::endl;
}
A(const A& copy) {
std::cout << "Copy Constructor Called !" << std::endl;
}
}
class B {
public:
A value;
//B(const A& val) : value(val){}
}
int main(){
B b { A(22)};
}

如果我注释掉B构造函数,输出将只是"构造函数参数被调用",但如果我取消注释B构造函数,输出将是"构造函数参数被调用"。,复制构造函数被调用。我的问题:

  1. 如果我注释掉构造函数,为什么输出不同?(我读过关于聚合类&聚合初始化,是这样吗?)
  2. 聚合初始化的区别是什么?直接初始化?

当您为B删除用户提供的构造函数时,B成为聚合。因此,在从初始化器列表的元素复制初始化类的每个元素时,执行聚合初始化。由于A(22)B的元素是同一类的右值,因此在不调用复制构造函数的情况下,将值直接存储到对象中进行复制省略。这是c++ 17的新特性。

当你为B声明构造函数时,它不再是一个聚合,所以当你做初始化时要考虑构造函数。

直接初始化只是意味着在初始化对象时没有=符号。聚合初始化是在初始化聚合时发生的,您可以查看cppreference上的定义。

最新更新