std:: indirectly_writable
|
헤더 파일에 정의됨
<iterator>
|
||
|
template
<
class
Out,
class
T
>
concept indirectly_writable
=
|
(C++20부터) | |
indirectly_writable
<
Out, T
>
개념은 값의 타입과 값 범주가
T
로 인코딩된 값을 반복자
Out
의 참조 객체에 기록하기 위한 요구사항을 명시합니다.
의미론적 요구사항
e
가
decltype
(
(
e
)
)
가
T
인 표현식이고,
o
가
Out
타입의 역참조 가능한 객체일 때,
indirectly_writable
<
Out, T
>
개념은 다음 조건에서만 충족됩니다:
-
만약
std::
indirectly_readable
<
Out
>
가 모델링되고
std::
iter_value_t
<
Out
>
이
std::
decay_t
<
T
>
와 동일한 타입이라면, 위의 할당 이후
*
o
는 할당 전
e의 값과 동일합니다.
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임 }