Namespaces
Variants

Assignable wrapper (C++20)

From cppreference.net
Ranges library
Range adaptors
Helper items
copyable-box
movable-box
(until C++23) (C++23)


template < class T >

requires std:: copy_constructible < T > && std:: is_object_v < T >

class /*copyable-box*/ ;
(C++20부터)
(C++23 이전까지)
( 설명 전용* )
template < class T >

requires std:: move_constructible < T > && std:: is_object_v < T >

class /*movable-box*/ ;
(C++23부터)
( 설명 전용* )

ranges::single_view , ranges::repeat_view , (C++23부터) 그리고 호출 가능 객체를 저장하는 범위 어댑터들은 설명 전용 클래스 템플릿 copyable-box (C++23 이전) movable-box (C++23부터) 로 명세됩니다. 여기에 표시된 이름은 설명 목적으로만 사용됩니다.

이 래퍼는 기본 생성자, 복사 할당 연산자, 이동 할당 연산자가 (조건부로) std::optional 와 다르다는 점을 제외하면 std:: optional < T > 와 정확히 동일하게 동작합니다. 이는 필요할 때 T 에 할당 가능성을 추가하고 항상 copyable 또는 movable (C++23부터) 을 만족하도록 합니다.

만약 T 가 이미 copyable 이거나, std:: is_nothrow_move_constructible_v < T > std:: is_nothrow_copy_constructible_v < T > 가 모두 true 라면, /*copyable-box*/ < T > 는 항상 값을 포함하므로 T 객체만 저장할 수 있습니다.

(C++23 이전)

만약 T

/*movable-box*/ < T > 는 항상 값을 포함하므로 T 객체만 저장할 수 있습니다.

(C++23 이후)

목차

템플릿 매개변수

T - 포함된 값의 타입, copy_constructible (until C++23) move_constructible (since C++23) 개념을 모델하는 객체 타입이어야 함

멤버 함수

기본 생성자

constexpr /*copyable-box*/ ( ) noexcept ( std:: is_nothrow_default_constructible_v < T > )

requires std:: default_initializable < T >

: /*copyable-box*/ ( std:: in_place ) { }
(C++20부터)
(C++23 이전까지)
constexpr /*movable-box*/ ( ) noexcept ( std:: is_nothrow_default_constructible_v < T > )

requires std:: default_initializable < T >

: /*movable-box*/ ( std:: in_place ) { }
(C++23부터)

기본 생성자는 T default_initializable 을 모델링할 때만 제공됩니다.

기본 생성된 래퍼는 값 초기화된 T 객체를 포함합니다.

할당 연산자

(1)
constexpr /*copyable-box*/ & operator = ( const /*copyable-box*/ & other ) ;
noexcept ( /* see below */ ) ;
(C++20부터)
(C++23 이전까지)
constexpr /*movable-box*/ & operator = ( const /*movable-box*/ & other ) ;
noexcept ( /* see below */ ) requires std:: copy_constructible < T > ;
(C++23부터)
(2)
constexpr /*copyable-box*/ & operator = ( /*copyable-box*/ && other )
noexcept ( std:: is_nothrow_move_constructible_v < T > ) ;
(C++20부터)
(C++23 이전까지)
constexpr /*movable-box*/ & operator = ( /*movable-box*/ && other )
noexcept ( std:: is_nothrow_move_constructible_v < T > ) ;
(C++23부터)
1) std:: copyable < T > 개념이 모델링되지 않는 경우, 복사 할당 연산자는 다음과 같이 동등하게 정의됩니다:

constexpr /*copyable-box*/ & operator = ( const /*copyable-box*/ & other )
noexcept ( std:: is_nothrow_copy_constructible_v < T > )
{
if ( this ! = std:: addressof ( other ) )
if ( other )
emplace ( * other ) ;
else
reset ( ) ;

return * this ;
}

(C++23 이전)

constexpr /*movable-box*/ & operator = ( const /*movable-box*/ & other )
noexcept ( std:: is_nothrow_copy_constructible_v < T > )
requires std:: copy_constructible < T >
{
if ( this ! = std:: addressof ( other ) )
if ( other )
emplace ( * other ) ;
else
reset ( ) ;

return * this ;
}

(C++23 이후)
그렇지 않은 경우, 이는 std::optional 의 복사 할당 연산자 와 동일합니다.
2) std:: movable < T > 가 모델되지 않는 경우, 이동 할당 연산자는 다음과 같이 동등하게 정의됩니다:

constexpr /*copyable-box*/ & operator = ( /*copyable-box*/ && other )
noexcept ( std:: is_nothrow_move_constructible_v < T > )
{
if ( this ! = std:: addressof ( other ) )
if ( other )
emplace ( std :: move ( * other ) ) ;
else
reset ( ) ;

return * this ;
}

(C++23 이전)

constexpr /*movable-box*/ & operator = ( /*movable-box*/ && other )
noexcept ( std:: is_nothrow_move_constructible_v < T > )
{
if ( this ! = std:: addressof ( other ) )
if ( other )
emplace ( std :: move ( * other ) ) ;
else
reset ( ) ;

return * this ;
}

(C++23 이후)
그렇지 않은 경우, 이는 std::optional 의 이동 할당 연산자 와 동일합니다.

std::optional과 동일한 std:: 멤버

멤버 함수

optional 객체를 생성함
( std::optional<T> 의 public 멤버 함수)
포함된 값이 있는 경우 이를 파괴함
( std::optional<T> 의 public 멤버 함수)
내용을 할당함
( std::optional<T> 의 public 멤버 함수)
관찰자
포함된 값에 접근함
( std::optional<T> 의 public 멤버 함수)
객체가 값을 포함하는지 확인함
( std::optional<T> 의 public 멤버 함수)
수정자
포함된 값을 파괴함
( std::optional<T> 의 public 멤버 함수)
포함된 값을 제자리에서 생성함
( std::optional<T> 의 public 멤버 함수)

참고 사항

A copyable-box (until C++23) movable-box (since C++23) 는 다음 경우에만 값을 포함하지 않습니다

  • T movable 또는 copyable 개념을 모델링하지 않고, 이동 대입 또는 복사 대입 시 각각 예외가 발생하는 경우, 또는
  • 다른 값 없는 래퍼(valueless wrapper)로부터 초기화/대입되는 경우.

P2325R3 이전에는, 표준에서 이 래퍼를 semiregular-box 라고 불렀으며 항상 semiregular 을 만족했습니다. 기본 생성자가 항상 제공되었기 때문입니다(이는 값을 가지지 않는 래퍼를 생성할 수 있었습니다).

기능 테스트 매크로 표준 기능
__cpp_lib_ranges 201911L (C++20) Ranges 라이브러리 constrained algorithms
202106L (C++20)
(DR)
Non- default-initializable views
202207L (C++23) range adaptors 완화하여 move-only 타입 허용

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
P2325R3 C++20 T default_initializable 가 아닌 경우, 기본 생성자는
값을 포함하지 않는 래퍼를 생성함
래퍼 또한
default_initializable 가 아님
LWG 3572 C++20 조건부로 다른 대입 연산자들이 constexpr이 아니었음 constexpr로 만듦

참고 항목

지정된 값을 가지는 단일 요소를 포함하는 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
동일한 값을 반복적으로 생성하여 만들어진 시퀀스로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
range 의 요소 중 조건자를 만족하는 요소들로 구성된 view
(클래스 템플릿) (레인지 어댑터 객체)
각 요소에 변환 함수를 적용한 시퀀스의 view
(클래스 템플릿) (레인지 어댑터 객체)
다른 view 의 초기 요소들로 구성된 view 로, 조건자가 false 를 반환하는 첫 번째 요소까지 포함
(클래스 템플릿) (레인지 어댑터 객체)
다른 view 의 요소들로 구성된 view 로, 조건자가 false 를 반환하는 첫 번째 요소까지의 초기 부분 시퀀스를 건너뜀
(클래스 템플릿) (레인지 어댑터 객체)
적응된 뷰들의 대응되는 요소들에 변환 함수를 적용한 결과로 구성된 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
적응된 뷰의 인접한 요소들에 변환 함수를 적용한 결과로 구성된 view
(클래스 템플릿) (레인지 어댑터 객체)