はい、標準ライブラリコンテナの要件に大きな変更がありました。包括的なリストを提供するのは難しいですが(たくさんありました)、ここにいくつかの重要なものがあります:
std::vector
通常、そのメンバーがMoveConstructibleおよびMoveAssignableである必要があるだけです。std :: vectorには、より厳しい要件を課す多くのメンバー関数があります。vector::push_back
Moveまたは CopyConstructible(右辺値と左辺値のどちらを渡すかによって異なります)が必要ですが、newvector::emplace_back
では、(ベースライン要件に加えて)指定されたパラメーターを受け取るアクセス可能なコンストラクターが存在する必要があります。明らかに、vector
のコピーコンストラクタ/代入を呼び出すには、型がCopyConstructibleである必要があります(つまり、をコピーすることはできませんstd::vector<unique_ptr>
)。
同様に、他のほとんどのコンテナでは、タイプの制限が緩和されています。またemplace
、メンバーをインプレースで構築できるメンバー関数や、l/rvalue挿入関数もあります。つまり、値をコピーする必要はありません。それらを移動したり、インプレースで構築したりできます。
コンストラクタまたはデストラクタはいずれもパブリックである必要はありません。すべての構築は、呼び出しからallocator_traits<Allocator>::construct
呼び出しを介して行われます。したがって、アロケータを提供する場合は、コンストラクタ/デストラクタをプライベートにすることができます。もちろん、アロケータクラスがそれらにアクセスできる限り。
つまり、要件はそれほど厳密ではありませんが、もう少し複雑です。コンテナで特定の操作を実行することを制限すると、多くのことを回避できます。