std::experimental:: propagate_const
|
헤더 파일에 정의됨
<experimental/propagate_const>
|
||
|
template
<
class
T
>
class propagate_const ; |
(라이브러리 fundamentals TS v2) | |
std::experimental::propagate_const
는 포인터 및 포인터류 객체를 위한 const 전파 래퍼입니다. const 접근 경로를 통해 접근할 때 래핑된 포인터를
const
에 대한 포인터로 취급하며, 이로 인해 해당 이름이 붙었습니다.
이 클래스는 기반 포인터와 유사한 타입이 해당 요구 사항을 충족하는 경우
MoveConstructible
및
MoveAssignable
요구 사항을 충족하지만,
propagate_const
는
CopyConstructible
도
CopyAssignable
도 아닙니다.
| 타입 요구사항 | ||
-
T
는 cv-unqualified 객체 포인터 타입이거나 아래에 명시된 바와 같은 cv-unqualified 포인터류 클래스 타입이어야 합니다.
|
목차 |
포인터와 유사한 클래스 타입에 대한 요구사항
만약
T
가 클래스 타입인 경우, 이 하위 섹션의 요구사항을 충족해야 합니다.
주어진
-
t, 타입T의 수정 가능한 lvalue 표현식 , -
ct,t와 동일한 객체를 나타내는 타입 const T 의 lvalue (C++17부터 std:: as_const ( t ) 와 동등), -
element_type, 객체 타입.
다음 표현식들은 유효해야 하며 지정된 효과를 가져야 합니다:
| 표현식 | 반환 타입 | 사전 조건 | 연산 의미론 |
|---|---|---|---|
| t. get ( ) | element_type * | ||
| ct. get ( ) | element_type * 또는 const element_type * | t. get ( ) == ct. get ( ) | |
| * t | element_type & | t. get ( ) ! = nullptr | * t 는 * ( t. get ( ) ) 와 동일한 객체를 참조함 |
| * ct | element_type & 또는 const element_type & | ct. get ( ) ! = nullptr | * ct 는 * ( ct. get ( ) ) 와 동일한 객체를 참조함 |
| t. operator - > ( ) | element_type * | t. get ( ) ! = nullptr | t. operator - > ( ) == t. get ( ) |
| ct. operator - > ( ) | element_type * 또는 const element_type * | ct. get ( ) ! = nullptr | ct. operator - > ( ) == ct. get ( ) |
| ( bool ) t | bool | ( bool ) t 는 t. get ( ) ! = nullptr 와 동등함 | |
| ( bool ) ct | bool | ( bool ) ct 는 ct. get ( ) ! = nullptr 와 동등함 |
또한,
T
와
const
T
는 문맥상
bool
로 변환 가능해야 합니다.
또한,
T
가
element_type
*
로 암시적으로 변환 가능한 경우,
(
element_type
*
)
t
는
t.
get
(
)
와 동일해야 합니다. 마찬가지로,
const
T
가
const
element_type
*
로 암시적으로 변환 가능한 경우,
(
const
element_type
*
)
ct
는
ct.
get
(
)
와 동일해야 합니다.
멤버 타입
| 멤버 타입 | 정의 |
| element_type |
std::
remove_reference_t
<
decltype
(
*
std::
declval
<
T
&
>
(
)
)
>
,
T
가 가리키는 객체의 타입
|
멤버 함수
새로운
propagate_const
를 생성합니다
(public 멤버 함수) |
|
|
(소멸자)
(암시적으로 선언됨)
|
propagate_const
를 소멸시키며, 포함된 포인터를 파괴합니다
(public 멤버 함수) |
propagate_const
객체를 할당합니다
(public 멤버 함수) |
|
|
래핑된 포인터를 교환합니다
(public 멤버 함수) |
|
관찰자(Observers) |
|
|
래핑된 포인터가 가리키는 객체에 대한 포인터를 반환합니다
(public 멤버 함수) |
|
|
래핑된 포인터가 null인지 확인합니다
(public 멤버 함수) |
|
|
래핑된 포인터를 역참조합니다
(public 멤버 함수) |
|
|
포인터로의 암시적 변환 함수
(public 멤버 함수) |
|
비멤버 함수
다른
propagate_const
, 다른 포인터, 또는
nullptr
와 비교
(함수 템플릿) |
|
swap
알고리즘을 특수화
(함수 템플릿) |
|
|
감싸진 포인터와 유사한 객체에 대한 참조를 획득
(함수 템플릿) |
헬퍼 클래스
propagate_const
에 대한 해시 지원
(클래스 템플릿 특수화) |
|
propagate_const
를 위한 표준 비교 함수 객체들의 특수화
(클래스 템플릿 특수화) |
예제
#include <experimental/propagate_const> #include <iostream> #include <memory> struct X { void g() const { std::cout << "X::g (const)\n"; } void g() { std::cout << "X::g (non-const)\n"; } }; struct Y { Y() : m_propConstX(std::make_unique<X>()), m_autoPtrX(std::make_unique<X>()) {} void f() const { std::cout << "Y::f (const)\n"; m_propConstX->g(); m_autoPtrX->g(); } void f() { std::cout << "Y::f (non-const)\n"; m_propConstX->g(); m_autoPtrX->g(); } std::experimental::propagate_const<std::unique_ptr<X>> m_propConstX; std::unique_ptr<X> m_autoPtrX; }; int main() { Y y; y.f(); const Y cy; cy.f(); }
출력:
Y::f (non-const) X::g (non-const) X::g (non-const) Y::f (const) X::g (const) X::g (non-const)
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3136 | LFTSv2 |
의미 없는
T
형식들(
int
*
const
,
void
*
, 또는
const
PtrLike
등)이 허용됨
|
허용되지 않음 |