1. 程式人生 > >深入理解C++11【3】

深入理解C++11【3】

深入理解C++11【3】

1、POD型別

  Plain Old Data. Plain 表示 了POD是個普通的型別。C++11將POD劃分為兩個基本概念的合集:

  1)平凡的(trivial)

  2)標準佈局的(standard layout)

 

  一個平凡的類或結構體應該符合以下定義:

  1)擁有平凡的預設建構函式(trivial constructor)和解構函式(trivial destructor)。

    平凡 的 預設 構造 函式 就是說 構造 函式“ 什麼 都 不幹”。 通常 情況下, 不 定義 類 的 構造 函式, 編譯器 就會 為我 們 生成 一個 平凡 的 預設 構造 函式。 而 一旦 定義 了 構造 函式, 即使 構造 函式 不 包含 引數, 函式 體 裡 也沒 有 任何 的 程式碼, 那麼 該 構造 函式 也 不再 是“ 平凡” 的。

  2)擁有平凡的拷貝建構函式(trivial copy constructor)和移動建構函式(trivial move constructor)。

  3)擁有平凡的拷貝賦值運算子(trivial assignmnt operator)和移動賦值運算子(trivial move operator)。

  4)不能包含虛擬函式以及虛基類。

 

  C++11中可以使用 is_trivial struct來判定一個型別是否是 trivial。

  類 模板 is_ trivial 的 成員 value 可以 用於 判斷 T 的 型別 是否 是一 個 平凡 的 型別。 除了 類 和 結構 體外, is_ trivial 還可 以對 內建 的 標量 型別 資料( 比如 int、 float 都 屬於 平凡 型別) 及 陣列 型別( 元素 是 平凡 型別 的 陣列 總是 平凡 的) 進行 判斷。

template < typename T> struct std:: is_ trivial;

 

  標準佈局應該符合以下定義:

  1)所有非靜態成員有相同的訪問許可權。

  2)在類或結構體繼承時,滿足以下兩種情況之一:

    a)派生類中有非靜態成員,且只有一個僅包含靜態成員的基類。

    b)基類有非靜態成員,而派生類沒有非靜態成員。

struct B1 { static int a; }; 
struct D1 : B1 { int d; }; 
struct B2 { int a; }; 
struct D2 : B2 { static
int d; }; struct D3 : B2, B1 { static int d; }; struct D4 : B2 { int d; }; struct D5 : B2, D1 { };

  D1、 D2 和 D3 都是 標準 佈局 的, 而 D4 和 D5 則 不屬於 標準 佈局 的。

  3)類中延續一個非靜態成員的型別與其基類不同。

struct A : B{ B b; }; // 不是標準佈局
struct C : B{int a; B b;} // 是標準佈局

 

  

 

2、