Namespaces
Variants

std:: indirectly_writable

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
헤더 파일에 정의됨 <iterator>
template < class Out, class T >

concept indirectly_writable =
requires ( Out && o, T && t ) {
* o = std:: forward < T > ( t ) ;
* std:: forward < Out > ( o ) = std:: forward < T > ( t ) ;
const_cast < const std:: iter_reference_t < Out > && > ( * o ) = std:: forward < T > ( t ) ;
const_cast < const std:: iter_reference_t < Out > && > ( * std:: forward < Out > ( o ) ) =
std:: forward < T > ( t ) ;
} ;

/* 위의 네 가지 표현식 중 어느 것도 동등성 보존을 요구하지 않음 */
(C++20부터)

indirectly_writable < Out, T > 개념은 값의 타입과 값 범주가 T 로 인코딩된 값을 반복자 Out 의 참조 객체에 기록하기 위한 요구사항을 명시합니다.

의미론적 요구사항

e decltype ( ( e ) ) T 인 표현식이고, o Out 타입의 역참조 가능한 객체일 때, indirectly_writable < Out, T > 개념은 다음 조건에서만 충족됩니다:

o 는 위의 할당 표현식들을 평가한 후에 역참조 가능할 필요가 없습니다. 만약 e 가 xvalue인 경우, 그것이 나타내는 객체의 결과 상태는 유효하지만 지정되지 않습니다.

동등성 보존

표준 라이브러리 개념의 requires expressions 에 선언된 표현식들은 equality-preserving 해야 합니다(다르게 명시된 경우를 제외하고).

참고 사항

유효한 사용법은 operator * 가 할당 표현식의 좌측에 위치하는 경우뿐입니다. 간접적으로 쓰기 가능한 타입의 동일한 값을 통한 할당은 한 번만 발생할 수 있습니다.

const_cast 를 사용한 필요한 표현식들은 프록시 참조가 얕은 constness를 가질 때 계속 작동하도록 허용하면서, 우연히 indirectly_readable 객체들이 prvalue reference 타입을 가진 경우 indirectly_writable 의 문법적 요구사항을 충족하는 것을 방지합니다. indirectly_readable 자세한 내용은 Ranges TS 이슈 381 을 참조하십시오.

struct Object
{
    Object& operator=(const Object& other) = default;
    int x;
};
struct ProxyReference
{
    ProxyReference& operator=(const ProxyReference& other) = default;
    const ProxyReference& operator=(const Object& o) const
    {
        *p = o;
        return *this;
    }
    Object* p;
};
struct I1 { Object& operator*(); };
struct I2 { Object operator*(); };
struct I3 { ProxyReference operator*(); };
static_assert(std::indirectly_writable<I1, Object>);
static_assert(!std::indirectly_writable<I2, Object>);
static_assert(std::indirectly_writable<I3, Object>);
static_assert(!std::indirectly_writable<I3, ProxyReference>);
void f(I1 i1, I2 i2, I3 i3, Object o)
{
    *i1 = o;  // OK, *i1이 참조하는 값에 할당
    *i2 = o;  // OK, 하지만 의미 없음: 이는 *i2가 반환한 임시 객체에 할당함
    *i3 = o;  // OK, ProxyReference::operator=(const Object& o) const 호출
              // 이는 *ptr = o를 수행하며, 여기서 ptr은 (*i3).p임
}