名前空間
変種
操作

名前付き要件: StandardLayoutType

提供: cppreference.com
< cpp‎ | named req
 
 
名前付き要件
基本
型の性質
StandardLayoutType
(C++11)
ライブラリ全体
コンテナ
コンテナの要素
イテレータ
ストリーム入出力
乱数
並行処理
(C++11)

(C++11)
(C++11)
その他
 

型が標準レイアウト型であることを指定します。 標準レイアウト型は他のプログラミング言語で書かれたコードとやりとりするために有用です。

ノート: 標準はこの名前を持つ名前付き要件を定義していません。 これはコア言語によって定義される型カテゴリです。 これは一貫性のためだけに名前付き要件としてここに含まれています。

目次

[編集] 要件

  • すべての非静的データメンバが同じアクセス制御を持つ。
  • 仮想関数または仮想基底クラスを持たない。
  • 参照型の非静的データメンバを持たない。
  • すべての非静的データメンバおよび基底クラスがそれ自体標準レイアウト型である。
  • 以下のいずれか:
  • 非静的データメンバを持つ基底クラスを持たない、または
  • 最も派生したクラスに非静的データメンバを持たず、非静的データメンバを持つ基底クラスを多くともひとつ持つ。
  • 最初の非静的データメンバと同じ型の基底クラスを持たない (空の基底の最適化を参照)。
(C++14未満)
  • 同じ型の (直接または間接的な) 基底クラスのサブオブジェクトを2つ持たない。
struct Q {};
struct S : Q { };
struct T : Q { };
struct U : S, T { };  // not a standard-layout class: two base class subobjects of type Q
  • すべての非静的データメンバおよびビットフィールドが同じクラス内で宣言される (すべてが派生クラス内であるか、すべてがいずれかの基底クラス内であるか、のどちらか)。
struct B { int i; };         // standard-layout class
struct C : B { };            // standard-layout class
struct D : C { };            // standard-layout class
struct E : D { char : 4; };  // not a standard-layout class
  • 以下と同じ型を持つ基底クラスのサブオブジェクトがない。 これは再帰的に適用されます (構造体の最初のメンバが構造体の場合はさらにその最初のメンバ、それがまた構造体の場合はさらにその最初のメンバ、等)。
  • 非共用体型の場合は、最初の非静的データメンバ (空の基底の最適化を参照)。
  • 共用体型の場合は、あらゆる非静的データメンバ。
  • 配列型の場合は、その配列要素の型。
(C++14以上)

[編集] 性質

標準レイアウトを参照してください。

[編集] 欠陥報告

以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。

DR 適用先 発行時の動作 正しい動作
CWG 1672 C++14 first non-static data member rule ignored existence of empty base classes first non-static data member rule made recursive
CWG 1813 C++14 class with a member defined in an indirect base wasn't technically standard-layout all member declarations must be in the same class
CWG 2120 C++14 array as first member wasn't considered when comparing the first element type with type of a base array members are considered

[編集] 関連項目

型が標準レイアウト型かどうか調べます
(クラステンプレート) [edit]