簡體   English   中英

值初始化 std::array 成員?

[英]Value-initializing std::array member?

假設我有一個包含std::array成員的類模板:

template<typename T>
class C {
public:
    C();

private:
    std::array<T, 42> a;
};

我如何定義C::C以便a始終是值初始化的(不是默認初始化的)? 即,使得構造函數調用T()到的每一個元素初始化a -而,例如,如果Tint ,那么每一個元件a被保證是零而不是靜不定值?

int main() {
   C<int> c;
   assert(c.a[13] == 0); // ignoring private for exposition
}

更新

給后代的額外信息:

  1. std::array是具有單個元素T[N]的聚合類型
  2. 由 init-list 初始化std::array是聚合初始化
  3. 使用空的 init-list 進行聚合初始化會導致每個元素不被顯式初始化。 這樣的元素被初始化,就好像通過從一個空的 init-list 復制初始化一樣。
  4. 因此數組T[N]是從一個空的初始化列表復制初始化的。 它也是一個聚合,因此 2 和 3 遞歸應用。
  5. T[N]的 N 個元素中的每一個都從一個空的 init-list 中復制初始化。
  6. 每個 T 對象都按照[dcl.init.list]/3使用空的 init-list 進行復制列表初始化。 到達該鏈的最后一個條款,內容如下:

否則,如果初始化列表沒有元素,則對象是值初始化的。

瞧。 用空的 init 列表{}初始化std::array會導致其元素被值初始化。

您可以使用內聯成員初始化:

private:
    std::array<T, 42> a{};

如果你絕對想用構造函數來代替(為什么?)那么:

C()
    : a{}
{ }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM