2017-10-20 77 views
4

我正在爲微控制器編寫代碼,並且需要確定我的結構是POD。我以爲我可以使用「成員初始值設定項列表」來初始化成員,但是這不會通過「is_pod」測試。在下面的例子中,A是POD,B和C不是。添加「D()= default;」到D似乎使它成爲POD。但是,通過這樣做,我不能再有一個「成員初始化列表」?有沒有辦法讓一個結構成爲一個POD,並且有一個「成員初始化列表」?C++ Struct失敗POD測試

#include <iostream> 
#include <string> 

struct A { 
    int var1; 
}; 

struct B { 
    int var1; 
    //B() = default; 
    B() : var1(100) {} 
}; 

struct C { 
    int bar [10]; 
    C() : bar{0} {} 
}; 

struct D { 
    int var1; 
    D() = default; 
    //D(int x) : var1(x) {} 
}; 


int main() 
{ 
    std::cout << std::boolalpha; 
    std::cout << "\nIs A a POD = " << std::is_pod<A>::value; 
    std::cout << "\nIs B a POD = " << std::is_pod<B>::value; 
    std::cout << "\nIs C a POD = " << std::is_pod<C>::value; 
    std::cout << "\nIs tD a POD = " << std::is_pod<D>::value; 
} 

===更新1 ===
謝謝回覆!所以,似乎沒有辦法在結構定義中初始化成員變量。下面的工作,但不像在結構本身的初始化那樣優雅。

typedef struct A_ { 
int var1; 
} A; 

A a = { 
    .var1 = 100 
}; 
+2

方便閱讀:http://en.cppreference.com/w/cpp/concept/PODType – user4581301

+2

這對重讀有點神祕。我想你會因缺乏默認的構造函數而被解除封裝。聲明構造函數會除去默認構造函數,除非您通過顯式聲明默認構造函數來計數。 – user4581301

+2

我相信你不能在pod-type結構中有任何自定義的初始化。 –

回答

0

POD必須是trivial type,這需要:

有一個或多個默認構造函數所有這些要麼瑣碎或刪除,以及至少一個其中沒有刪除。

而一個簡單的構造函數有一個描述沒有行動。因此,在結構本身中具有初始化的「」明確反對它。

的興趣的硬要求是:

  • 構造方法中沒有用戶提供的(即,隱式定義的或默認的首次聲明)
  • 的每一個非靜態成員類類型有一個平凡缺省構造 是,它必須是默認情況下,所有的所有成員都構造

您必須在構造函數的定義中使用var1的默認構造函數。即var1(100)是「no bueno」。 (注意:您可以使用會員ctor,但只能使用默認形式,例如var1(),與省略相同)。

請注意,在聲明對象時使用聚合初始化與將其設置爲默認值存在主要區別。需要一些工作來設置這些變量,並且默認創建POD「不能沒有」。