首页 > 解决方案 > 对象数组中的显式构造函数

问题描述

struct Row
{
  Row() { puts("default"); }
  Row(const Row &other) { puts("copy"); }
  Row(Row &&other) { puts("move"); }
  explicit Row(int) { puts("conv. c'tor"); }  
};

int main()
{

  Row rs;   
  Row r[3] = {1, 3, rs};

  Row r3[3]{1, 3, rs}; // no conversion exists 

}

我知道显式构造函数不是复制初始化的候选者。但是,直接初始化怎么会出错呢?

还有如何在内存中分配对象数组?它和标量类型的数组一样吗?如果我关闭 elide 构造函数标志并删除显式关键字,我会先得到 conv、move、conv、move 和 copy,第二个也是一样的?有人可以解释一下吗?

标签: c++11

解决方案


C++11 dcl.init#14

以 T x = a 形式发生的初始化;以及在参数传递、函数返回、抛出异常([except.throw])、处理异常([except.handle])和聚合成员初始化([dcl.init.aggr])中称为复制初始化.

聚合成员初始化是复制初始化,而不是直接初始化。


推荐阅读