非静态数据成员初始化器/调用std :: vector的构造函数

Sun*_*min 4 c++ c++11

码:

class A {
  std::vector<int> x = {2,3};                 // x[0] = 2 and x[1] = 3
  std::vector<int> y = std::vector<int>(2,3); // x[0] = 3 and x[1] = 3 Too verbose!!  
};
Run Code Online (Sandbox Code Playgroud)

有没有办法可以调用std::vector<int>只使用大括号初始化程序的构造函数,或者至少是更短的版本,它会产生相同的效果?

我不想重复std::vector<int>.

Fil*_*efp 6

我可以使用任何黑客攻击吗?

如果您的唯一目标是不必"明确"指定两次类型,那么您可以使用它decltype来为您的任务提供一些帮助:

class Obj {
  std::vector<int> v1 = decltype(v1) (2,3);
};
Run Code Online (Sandbox Code Playgroud)

还要记住typedef/这using是一个不必输入1的好方法:

struct Obj {
   using VInt = std::vector<int>;
// typedef std::vector<int> VInt;

   VInt v = VInt (3,2);
};
Run Code Online (Sandbox Code Playgroud)

1. 双关语不打算


标准对此有何评价?

可悲的是,该标准说明了关于在班级正文中初始化成员的内容:

9.2/5班级成员[class.mem]

可以使用大括号或等号初始化程序初始化成员.(对于静态数据成员,请参见9.4.2;对于非静态数据成员,请参见12.6.2).

我们已经在初始化成员时已经找到了一些关于什么是什么和什么不可行的提示,但是要100%确定我们应该继续阅读支撑或平等初始化器的真正含义.

8.5/1 Initializers [dcl.init]

... brace-or-equal-initializer: = initializer-clause braced-init-list initializer-clause: assignment-expression braced-init-list initializer-list: initializer-clause ...opt initializer-list , initializer-clause ...opt braced-init-list: { initializer-list ,opt } { }

使用braced-or-equal-initializer的上述规范,我们发现在初始化类的主体内时,我们面临两个选项,使用=一个初始化子句或者一个braced-init-list自己的子句.

以上归结为这两者中的任何一个:

struct Obj {
  Type foo = Type (1,2,3); /* example of an initializer-clause */
  Type bar        {1,2,3}; /* example of a  braced-init-list   */
};
Run Code Online (Sandbox Code Playgroud)

braced-init-list看起来很棒,让我们用吧!

由于std::vector<...>接受了std::initializer_list它的构造函数的一个重载,我们不能使用braced-init-list来调用带有两个参数的构造函数(size_type count, const T& value),因为它将被用作向量的内容.

因此,我们坚持使用初始化子句.

请参阅之前的hack以确认,但可能不是那么明显的解决方案.