根据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):错误C2797:&#39; Container :: arr&#39;:成员初始化列表或非静态数据成员初始化程序中的列表初始化未实现
根据C ++的新标准,代码是否应该有效?如果是这样,是不是我的Visual Studio版本不支持它呢?
为了达到同样的效果,我编写了以下代码。代码中是否存在任何潜在问题?因为我不确定代码是否正确。
Container() :
arr( decltype(arr){ 0, 1, 2 } )
{}
P.S。我正在使用Microsoft Visual Studio Community 2013。
答案 0 :(得分:8)
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支持不完整)。