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初始化程序[dcl.init]
…大括号或相等的初始值设定项:=初始值设定项子句支持的init列表初始值设定项子句:赋值表达式支持的init列表初始值设定项列表:初始值设定项子句。。。选择初始化器列表,初始化器子句。。。选择braked init列表:{初始值设定项列表,opt}{}
通过以上braked或equal初始值设定项的规范,我们发现在初始化类主体内的成员时,我们面临两个选项,要么使用=
和初始值设定子句,要么单独使用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 */
};
braked init list看起来很棒,让我们使用它吧
由于std::vector<...>
在其构造函数的一个重载中接受std::initializer_list
,因此不能使用支持的init列表来调用带有两个参数(size_type count, const T& value)
的构造函数,因为这将被用作向量的内容。
因此,我们不得不使用初始值设定项子句。
请参阅前面的破解以获得一个确认但可能不那么明显的解决方案
梦幻般的解决方案
如果你只是不想重复std::vector
,怎么样
class A
{
auto y = std::vector<int>(2,3);
};
这是不允许的,标准规定(7.1.6.4)[dcl.spec.auto]
:
auto
类型说明符也可用于在选择语句或迭代语句的条件下声明变量,在新表达式的新类型id或类型id中的type说明符seq中,以及用大括号或等价初始化器声明静态数据成员,该初始化器出现在类定义的成员规范中。
当大括号或等号初始值设定项语法添加到非静态成员时,他们可能忘记更新此行。
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 我们可以用参数化构造函数初始化结构的数组吗?
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 类内初始化与构造函数初始化列表的顺序
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 使用复制构造函数初始化 new[]
- 如何从子类的构造函数初始化父类的私有成员
- 在构造函数初始化列表中使用 std::variant
- 使用构造函数初始化结构还是在之后设置其值更好?
- C++ 没有匹配的构造函数初始化 []
- 我正在使用dev c ++,但收到错误(C++98'array'必须由构造函数初始化)
- 使用所述填充构造函数初始化向量中的向量
- 如何同时创建一个具有两个或多个构造函数初始化的对象
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- 这是使用构造函数初始化数组对象的最佳方法吗?
- 内置类型的构造函数初始化
- 构造函数初始化和对象损坏