std::copy_constructible

std::copy_constructible (복사 구성 가능성 개념)

T가 lvalue 참조 타입이거나, 그 타입의 객체가 (possibly const) lvalue 또는 const rvalue로부터 직접·복사 초기화 문맥 모두에서 (원본을 바꾸지 않고 복사본을 만드는) 일반적 의미로 구성 가능한 move_constructible 객체 타입인지를 명세하는 개념(concept)이에요. C++20부터 있어요.

출처: cppreference

본문

<concepts> 헤더에 정의돼 있어요.

template< class T >
concept copy_constructible =
    std::move_constructible<T> &&
    std::constructible_from<T, T&> && std::convertible_to<T&, T> &&
    std::constructible_from<T, const T&> && std::convertible_to<const T&, T> &&
    std::constructible_from<T, const T> && std::convertible_to<const T, T>;

개념 copy_constructibleT가 lvalue 참조 타입이거나, 그 타입의 객체가 (possibly const) lvalue 또는 const rvalue로부터 직접·복사 초기화 문맥 모두에서 (원본을 바꾸지 않고 복사본을 만드는) 일반적 의미로 구성 가능한 move_constructible 객체 타입이면 만족돼요.

의미 요구사항

T가 객체 타입이면, 다음이 주어졌을 때 copy_constructible<T>가 모델링돼요.

  • v: (possibly const) T 타입의 lvalue 또는 const T 타입의 rvalue.

다음이 참이어야 해요.

  • 정의 T u = v; 이후, uv와 같고 v는 수정되지 않는다.
  • T(v)v와 같고 v를 수정하지 않는다.

즉 복사 생성 결과가 원본과 동등하고 원본이 그대로 유지돼야 해요. copy_constructible은 컨테이너·알고리즘에서 원소 타입을 제약할 때 핵심이 되는 객체 개념(object concept)이에요.

참고 문헌

  • C++23 표준 (ISO/IEC 14882:2024): 18.4.14 Concept copy_constructible [concept.copyconstructible]
  • C++20 표준 (ISO/IEC 14882:2020): 18.4.14 Concept copy_constructible [concept.copyconstructible]

더 알아보기 (Learn more)

cppreference