簡體   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