C++ named requirements: CopyConstructible
해당 타입의 인스턴스가 lvalue expression 으로부터 복사 생성될 수 있음을 지정합니다.
목차 |
요구사항
타입
T
가 다음 조건을 만족하면
CopyConstructible
을 만족합니다
-
타입
T가 MoveConstructible 를 만족하며, 그리고
주어진
다음 표현식들은 유효해야 하며 지정된 효과를 가져야 합니다:
| Expression | Post-conditions |
|---|---|
| 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 이슈 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)
|
타입의 객체가 복사 생성 및 이동 생성될 수 있음을 명시합니다
(컨셉트) |