Namespaces
Variants

C++ named requirements: CopyConstructible

From cppreference.net
C++ named requirements

해당 타입의 인스턴스가 lvalue expression 으로부터 복사 생성될 수 있음을 지정합니다.

목차

요구사항

타입 T 가 다음 조건을 만족하면 CopyConstructible 을 만족합니다

주어진

  • v , T 타입 또는 const T 타입의 lvalue 표현식, 또는 const T 타입의 rvalue 표현식
  • u , 임의의 식별자

다음 표현식들은 유효해야 하며 지정된 효과를 가져야 합니다:

Expression Post-conditions
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 이슈 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]

참고 항목

타입이 복사 생성자를 가지는지 검사합니다
(클래스 템플릿)
타입의 객체가 복사 생성 및 이동 생성될 수 있음을 명시합니다
(컨셉트)