如何保持隐式声明的聚合初始化构造函数?

时间:2015-12-19 01:36:17

标签: c++ c++11 c++14

假设我有这样一个类:

struct X {
  char buf[10];
};
X x{"abc"};

这个编译。但是,如果我将用户定义的构造函数添加到类中,则将删除此隐式声明的聚合初始化构造函数:

struct X {
  char buf[10];
  X(int, int) {}
};
X x{"abc"}; // compile error

如何声明我想要默认聚合初始化构造函数,就像默认构造函数X()=default一样?感谢。

2 个答案:

答案 0 :(得分:6)

没有"默认聚合初始化构造函数"。

聚合初始化仅发生在聚合上。聚合是除了其他东西之外没有(用户提供的)构造函数的类型。你要求的东西在逻辑上是不可能的。

正确的做法是做一个工厂功能,以特殊的方式构建你的类型。这样,类型可以保持聚合,但是以你想要的方式初始化它是一种简便方法。

如果要强制用户调用构造函数来构造它,则为类型提供构造函数。如果你不这样做,你只需使用工厂功能。

答案 1 :(得分:0)

你可以提供另一个构造函数,它将一个字符串作为参数,如下所示:

struct X {
  char buf[10];
  X(int, int) {}
  X(char const *str) {
    strncpy(buf, str, 10);
  }
};

Live Demo