繁体   English   中英

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

[英]Non-static Data Member Initializers / Calling constructors of std::vector

码:

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!!  
};

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

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

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

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

class Obj {
  std::vector<int> v1 = decltype(v1) (2,3);
};

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

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

   VInt v = VInt (3,2);
};

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的上述规范,我们发现在初始化类的主体内时,我们面临两个选项,使用a =initializer-clause ,或者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   */
};

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

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

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

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

梦幻般的解决方案..

如果你只是不想重复std::vector ,怎么样

class A
{
    auto y = std::vector<int>(2,3);
};

是不允许的 ,标准说(7.1.6.4) [dcl.spec.auto]

auto -type specifier还可用于在选择语句或迭代语句的条件中声明变量,在new-type-id中的type-specifier-seq或new-expression的type-id中, for-range-declaration ,以及声明一个静态数据成员,该成员具有一个出现在类定义的成员规范中的大括号或等于初始化程序

大括号初始化程序语法添加到非静态成员时,他们可能忘记更新此行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM