gpt4 book ai didi

c++ - std::array 默认初始化还是值初始化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:48 24 4
gpt4 key购买 nike

根据 cppreference , std::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): error C2797: 'Container::arr': list initialization inside member initializer list or non-static data member initializer is not implemented

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

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

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

附言我正在使用 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 支持不完整)。

关于c++ - std::array 默认初始化还是值初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31181568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com