C++ 名前付き要件: CopyConstructible
From cppreference.com
lvalue 式から型のインスタンスをコピー構築できることを指定します。
目次 |
[編集] 要件
型 T が CopyConstructible を満たすのは、以下の条件の場合です。
- 型
Tは MoveConstructible を満たし、かつ
以下を考えます。
以下の式は有効であり、指定された効果を持たなければなりません。
| Expression | 事後条件 |
|---|---|
| T u = v; | u の値は v の値と同等である。 v の値は変更されない。 |
| T(v) | T(v) の値は v の値と同等である。 v の値は変更されない。 |
|
式 v.~T() も有効でなければならず、lvalue v の場合、式 &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++11)(C++11)(C++11) |
型がコピーコンストラクタを持つかをチェックする (クラステンプレート) |
| (C++20) |
その型のオブジェクトがコピー構築およびムーブ構築可能であることを規定する (コンセプト) |