Namespaces
Variants

C++ named requirements: CopyConstructible

From cppreference.net
C++ named requirements

その型のインスタンスが lvalue式 からコピー構築可能であることを指定します。

目次

要件

T は、以下の条件を満たす場合に CopyConstructible を満たします

与えられた

  • v 、型 T または const T lvalue 式、または型 const T rvalue 式、
  • u 、任意の識別子。

以下の式は有効であり、指定された効果を持たなければなりません:

事後条件
T u = v ; u の値は v の値と等価である。

v の値は変更されない。

T ( v ) T ( v ) の値は v の値と等価である。

v の値は変更されない。

v.~T ( ) も有効でなければならず、左辺値 v に対しては、式 & v は型 T* または const T * を持ち、かつ v のアドレスに評価されなければならない。

(C++11以前)

注記

C++11以前、 operator & をオーバーロードしたクラスは CopyConstructible ではなく、したがって 標準ライブラリコンテナ で使用できませんでした。これはC++98における設計上の決定です(不具合ではなく、 LWG issue 390 を参照)。

C++11以降、標準ライブラリはオブジェクトのアドレスが必要な場合には常に std::addressof を使用します。

拡張コンテンツ

CopyConstructible クラスであることは std::is_copy_constructible を意味しますが、逆は成り立ちません。なぜなら std::is_copy_constructible は正しい引数でコンストラクタを呼び出す能力のみをチェックし、例えば MoveConstructible 要件はチェックしないからです。

#include <type_traits>
#include <utility>
struct S
{
    S() = default;
    S(S&&) = delete;
    S(const S&) = default;
};
static_assert(std::is_copy_constructible_v<S>);
int main()
{
    S s1;
    // クラス `S` は MoveConstructible 要件を満たさないため、
    // CopyConstructible 要件も満たさない
    [[maybe_unused]] S s2{std::move(s1)}; // 不正、削除された関数の使用
}

参考文献

拡張コンテンツ
  • C++23 standard (ISO/IEC 14882:2024):
  • 16.4.4.2 Template argument requirements [utility.arg.requirements]

関連項目

型がコピーコンストラクタを持つかどうかをチェックする
(クラステンプレート)
型のオブジェクトがコピー構築およびムーブ構築可能であることを指定する
(コンセプト)