繁体   English   中英

std :: array是default-initialize还是value-initialize?

[英]Does std::array default-initialize or value-initialize?

根据cppreferencestd::array的构造函数在创建std::array时执行默认初始化。 但是,当我在Visual Studio 12.0中进行一些测试时,在某些情况下std::array似乎正在执行值初始化。

std::array<int, 3> arr1;  // gives me some garbage values, as expected
auto arr2 = std::array<int, 3>();  // gives me three 0, value-initialize?

此外,当std::array是类的成员时,有时它具有不确定的值,而有时它全部为零。

class Container {
public:
    Container() ...

    int& operator[](size_t i) { return arr[i]; }    
    size_t size() { return ARR_SIZE; }

private:
    static const size_t ARR_SIZE = 3;
    std::array<int, ARR_SIZE> arr;
};

如果没有显式定义构造函数或者arr不在成员初始值设定项列表中,则arr包含不确定的值。

Container() {}  // arr has indeterminate values, same for no constructor case

arr在成员初始化列表中时, arr包含全零。

Container():
    arr()  // arr contains 0, 0, 0
{}

此外,当我写下面的代码时,我收到一个错误。

Container() :
    arr{ 0, 1, 2 }
{}

g:\\ cppconsole \\ cppconsole \\ main.cpp(89):错误C2797:'Container :: arr':成员初始化列表中的列表初始化或非静态数据成员初始值设定项未实现

根据C ++的新标准,代码应该是有效的吗? 如果是这样,是不是我的Visual Studio版本不支持它?

为了达到同样的效果,我编写了以下代码。 代码中是否存在任何潜在问题? 因为我不确定代码是否正确。

Container() :
    arr( decltype(arr){ 0, 1, 2 } )
{}

PS我正在使用Microsoft Visual Studio Community 2013。

std::array是一个聚合,它没有构造函数(这是有意的)。 因此,当默认初始化时,它默认初始化其元素。 在初始化值时,它会初始化它们。

要分析您的代码:

std::array<int, 3> arr1;  // gives me some garbage values, as expected
auto arr2 = std::array<int, 3>();  // gives me three 0, value-initialize?

arr1是默认初始化的。 arr2是从使用()初始化的临时文件进行复制初始化,即初始化值。

Container() {}

这使成员arr默认初始化。

Container():
    arr()  // arr contains 0, 0, 0
{}

这使用()初始化arr ,这是值初始化。

Container() :
    arr{ 0, 1, 2 }
{}

这是合法的C ++ 11,但VS 2013显然不支持它(它的C ++ 11支持不完整)。

暂无
暂无

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

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