Namespaces
Variants

std::experimental:: propagate_const

From cppreference.net
헤더 파일에 정의됨 <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 등)이 허용됨 허용되지 않음