基本类型的std ::向量的默认值

Default value of std::vector for base types

本文关键字:向量 默认值 std 类型      更新时间:2023-10-16

我正在尝试找出如何用固定尺寸杀死std::vector<Object *>,因为之后我不再需要更改它。因此,我正在使用此代码(矢量是空的):

mControllerItem.resize(nLines,  nullptr);

根据文档,第二个元素可用于指定将复制到新元素中的默认值,但这是可选的。如果没有给出第二个参数,则使用默认构造函数。

如果基本类型,例如指针,int等。在链接中,它没有说什么。它们会被初始化为0,是否保持不确定,或者是否有其他机制可以确定它们将获得什么值?在链接上的示例中,输出为0,所以我认为它是对此毫无意义的,但是此guaruanteed是定义的,还是该实现(或联合国)定义?

标准规定 resize value-initialize 任何需要插入的项目,因此这里的行为非常定义。

简单的术语,价值定性的意思是:

  • 对于类类型,默认构造函数被称为;如果没有提供构造函数,则每个成员都是值initialial的(递归)
  • 对于任何类型T的标量,它们都会获得值(T)0(这可以保证,如果T是指针,则所使用的值将被置于null)

该行为的定义在C 03和C 11之间略有不同。在前者中,创建了一个价值定位的对象,并且向量中的新元素是从中构建的。在新版本中,新元素被直接化。

对于诸如指针之类的内置类型,价值限制等于零初始化,因此,您的元素在事实上保证为标准的两个版本都为零。

请注意,您的假设实际上并不完全正确。是,但仅适用于自定义类型。碰巧的是,用于价值定义的语法调用自定义类型的默认构造函数,而内置类型的零命名化。

是的,如果指示它们将被初始化为bu nulls。所有基本类型都有默认构造函数。唯一的区别是遵循

  1. int a;//默认构造函数不会被调用,因此值为未定义
  2. class C {int a; C(): a()};//默认构造函数将被调用,值将为0
  3. void f(int a = int())//默认构造函数将被调用,值将为0