2013-06-25 127 views
24
struct MyClass 
{ 
    std::array<int, 10> stdArr; 

    MyClass() : stdArr() 
    {} 
}; 

MyClass c; 

問題:是std :: array <int, 10>作爲類成員零初始化?

  1. c.stdArr零初始化?
  2. 如果是 - 爲什麼?

我自己的矛盾的答案:

  1. 它是零初始化: std::array要像一個C-陣列。 如果在我上面的示例中stdArr是一個c數組,它將在初始化列表中由stdArr()進行零初始化。我期望在初始化列表中寫入member()可以初始化對象。

  2. 它不是零初始化:

    • std::array通常只有一個成員是在我的情況int[10] _Elems;
    • 通常基本類型和基本類型,如int[N]的陣列不是默認初始化。
    • std::array是一個聚合類型,暗示它是默認構造的。
    • 因爲沒有自定義構造函數初始化_Elems,我認爲它不是零初始化的。

什麼是根據C++ 11標準的std::array正確的行爲?

+0

[CPP參考說](http://en.cppreference.com/w/cpp/container/array),該集合初始化工作於'性病:: array',i。即元素**是**零初始化的。 – 2013-06-25 12:33:03

+0

@ H2CO3聚集初始化的工作原理意味着它可以使用'{...}'語法進行初始化。這在這裏沒有關係,沒有聚合初始化。 – hvd

+0

我鏈接了另一個完全解釋何時默認初始化以及何時零初始化的問題。 –

回答

19

c.stdArr零初始化?

如果是 - 爲什麼?

這執行了value initializationstdArr的:

MyClass() : stdArr() {} 

在這種情況下,該值初始化的效果是對象的一個​​zero initialization

編輯:有大量的相關信息What are Aggregates and PODs...?

+4

我本來期望的是':stdArr()'只是調用的std ::陣列的默認構造函數,它什麼也不做!? – Martin85

+4

@ Martin85這不是它是如何工作的。人們必須提供一個用戶定義的默認構造函數,它不會執行任何操作(在進程中呈現'std :: array'非聚合)。這是一個句柄,C++使我們能夠初始化POD和聚合。 – juanchopanza

+0

[(恐怖)現場實例](http://ideone.com/Y8AXoM)(絕不是證明,我知道) –

1

「std :: array想要表現得像一個c數組」不是標準描述行爲的方式。這是一個用戶定義的類型,和用戶定義類型的成員都是通過調用其構造函數初始化,即array<int,10>::array()

+9

'std :: array'沒有構造函數。 –

+0

好吧,我們最好說,我想像一個c數組一樣表現std :: array。但我是對的,你認爲'c.stdArr'在我的代碼片段中初始化?謝謝。 – Peter

+0

@ R.MartinhoFernandes:它沒有被刪除,所以它確實有一個:編譯器生成的。 – MSalters