まず第一に、これは私よりも言語標準の深さに精通している人々からの承認を得るための健全性チェックの質問です。
次のタイプがあるとしましょう(ただし、非コンストラクターおよび非割り当てメンバー関数は省略しました)。
template<typename E> struct half_expr
{
};
class half : public half_expr<half>
{
public:
half();
explicit half(float);
template<typename E> half(const half_expr<E>&);
half& operator=(float);
template<typename E> half& operator=(const half_expr<E>&);
private:
half(std::uint16_t, bool);
std::uint16_t data_;
};
まあ、合理的な実装でhalf
は、aはプレーン以外のものであってはなりませんstd::uint16_t
。しかし、私は標準からの保証に興味を持っています。これが、PODのC++98/03定義による私の理論的根拠です。
half
非パブリックフィールド、基本クラス、およびユーザー定義のコンストラクターがあるため、PODタイプにすることはできません。
およびC++11の失われた/拡張された定義:
暗黙的に生成されたコピー/移動コンストラクター/割り当てのみであるため、簡単にコピー可能である必要がありますが、それら
float
とテンプレートのバージョンがまったくカウントされない場合に限ります。これは完全にはわかりません。また、基本タイプのプライベートフィールドが1つと、空の非仮想基本クラスが1つしかないため、標準レイアウトにする必要があります(どの標準でもPODである必要がありますか?)
half() = default
POD分類を妨げる唯一のことは、それが自明にデフォルトで構築可能ではないということです。これは、C++11の構文を使用することでIMHOが克服できる可能性があります。
私の非常に単純な質問は、私の理論的根拠は完全に正しいのか、それとも、特にユーザー定義のコンストラクターと割り当てが自明なコピー可能としての分類を何らかの形で妨げているという観点から、定義で見落としたり誤解したりしたことはありますか?
注:これをPODと標準レイアウトタイプ(私は完全に理解できます)に関するいくつかの可能な重複に委任したいという衝動を感じたとしても、これは単なる健全性チェックであるため、私の実際の質問に答える簡単なコメントはまだいいでしょう、これはあなたにとって単純または不必要に起こるかもしれませんが、私はただ安全な側にいたいと思います。