C++ named requirements: CopyConstructible
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
その型のインスタンスが lvalue式 からコピー構築可能であることを指定します。
目次 |
要件
型
T
は、以下の条件を満たす場合に
CopyConstructible
を満たします
-
型
Tは MoveConstructible を満たし、かつ
与えられた
以下の式は有効であり、指定された効果を持たなければなりません:
| 式 | 事後条件 |
|---|---|
| T u = v ; |
u
の値は
v
の値と等価である。
v の値は変更されない。 |
| T ( v ) |
T
(
v
)
の値は
v
の値と等価である。
v の値は変更されない。 |
|
式
v.~T
(
)
も有効でなければならず、左辺値
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; // クラス `S` は MoveConstructible 要件を満たさないため、 // CopyConstructible 要件も満たさない [[maybe_unused]] S s2{std::move(s1)}; // 不正、削除された関数の使用 } |
参考文献
| 拡張コンテンツ |
|---|
|
関連項目
|
(C++11)
(C++11)
(C++11)
|
型がコピーコンストラクタを持つかどうかをチェックする
(クラステンプレート) |
|
(C++20)
|
型のオブジェクトがコピー構築およびムーブ構築可能であることを指定する
(コンセプト) |