名前空間
変種
操作

C++ 名前付き要件: CopyConstructible

From cppreference.com
 
 
C++ 名前付き要件
 

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

目次

[編集] 要件

TCopyConstructible を満たすのは、以下の条件の場合です。

以下を考えます。

  • v は、型 T または const Tlvalue 式、または型 const Trvalue 式である。
  • u は、任意の識別子である。

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

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

v の値は変更されない。

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

v の値は変更されない。

v.~T() も有効でなければならず、lvalue 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;
 
    // Class `S` doesn't satisfy MoveConstructible requirement,
    // hence doesn't satisfy CopyConstructible requirement
    [[maybe_unused]] S s2{std::move(s1)}; // ill-formed, use of deleted function
}

[編集] 参照

拡張コンテンツ
  • C++23標準 (ISO/IEC 14882:2024)
  • 16.4.4.2 テンプレート引数要件 [utility.arg.requirements]

[編集] 関連項目

型がコピーコンストラクタを持つかをチェックする
(クラステンプレート) [編集]
その型のオブジェクトがコピー構築およびムーブ構築可能であることを規定する
(コンセプト) [編集]
English 日本語 中文(简体) 中文(繁體)