Assignable wrapper (C++20)
|
template
<
class
T
>
requires
std::
copy_constructible
<
T
>
&&
std::
is_object_v
<
T
>
|
(C++20부터)
(C++23 이전까지) ( 설명 전용* ) |
|
|
template
<
class
T
>
requires
std::
move_constructible
<
T
>
&&
std::
is_object_v
<
T
>
|
(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부터)
을 만족하도록 합니다.
|
만약
|
(C++23 이전) |
|
만약
/*movable-box*/
<
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
>
|
(C++20부터)
(C++23 이전까지) |
|
|
constexpr
/*movable-box*/
(
)
noexcept
(
std::
is_nothrow_default_constructible_v
<
T
>
)
requires
std::
default_initializable
<
T
>
|
(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부터) | |
|
constexpr
/*copyable-box*/
&
operator
=
(
const
/*copyable-box*/
&
other
)
|
(C++23 이전) |
|
constexpr
/*movable-box*/
&
operator
=
(
const
/*movable-box*/
&
other
)
|
(C++23 이후) |
std::optional
의 복사 할당 연산자
와 동일합니다.
|
constexpr
/*copyable-box*/
&
operator
=
(
/*copyable-box*/
&&
other
)
|
(C++23 이전) |
|
constexpr
/*movable-box*/
&
operator
=
(
/*movable-box*/
&&
other
)
|
(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
(클래스 템플릿) (레인지 어댑터 객체) |