Namespaces
Variants

std::experimental::ranges:: Assignable

From cppreference.net
헤더 파일에 정의됨 <experimental/ranges/concepts>
template < class T, class U >

concept bool Assignable =
std:: is_lvalue_reference < T > :: value &&
CommonReference <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & > &&
requires ( T t, U && u ) {
{ t = std:: forward < U > ( u ) } - > Same < T > && ;

} ;
(ranges TS)

Assignable<T, U> 개념은 U 에 의해 지정된 유형 및 값 범주를 가진 표현식을 T 에 의해 지정된 유형을 가진 lvalue 표현식에 할당할 수 있음을 명시합니다.

주어진

  • t , 타입 std:: remove_reference_t < T > 의 lvalue로서 객체 o 를 참조하는 것,
  • u , decltype ( ( u ) ) U 인 표현식,
  • u2 , u 와 동일한 값을 가지는 별개의 객체,

Assignable<T, U> 는 다음 조건에서만 만족됩니다

  • std:: addressof ( t = u ) == std:: addressof ( o ) (즉, 대입 표현식은 좌측 피연산자를 참조하는 lvalue를 반환함);
  • t = u 평가 후:
    • t u2 와 동일함 (단, u o 를 참조하는 비-const xvalue인 경우, 즉 대입이 자기 이동 대입인 경우는 제외);
    • u 가 glvalue인 경우:
      • 비-const xvalue인 경우, 그것이 참조하는 객체는 유효하지만 지정되지 않은 상태임;
      • 그렇지 않으면, 그것이 참조하는 객체는 수정되지 않음;

Assignable<T, U> std:: is_lvalue_reference < T > :: value 사이에는 어떠한 포함 관계도 존재하지 않을 수 있습니다.

동등성 보존

표현식은 동일한 입력이 주어졌을 때 동일한 출력을 결과로 내놓는다면 등식 보존(equality preserving) 합니다.

  • 표현식의 입력은 피연산자들로 구성됩니다.
  • 표현식의 출력은 결과와 표현식에 의해 수정된 모든 피연산자(있는 경우)로 구성됩니다.

동등성 보존이 요구되는 모든 표현식은 추가로 안정적(stable) 이어야 합니다: 동일한 입력 객체에 대한 이러한 표현식의 두 평가는 해당 입력 객체에 대한 명시적인 중간 수정이 없는 한 동일한 출력을 가져야 합니다.

달리 명시되지 않는 한, requires-expression 에서 사용되는 모든 표현식은 등식 보존적이고 안정적이어야 하며, 표현식의 평가는 비상수 피연산자만 수정할 수 있습니다. 상수인 피연산자는 수정되어서는 안 됩니다.

참고 사항

{ expression } - > Same < T > && 형태의 추론 제약은 효과적으로 decltype ( ( expression ) ) && T&& 와 정확히 동일한 타입이어야 함을 요구합니다. 이는 표현식의 타입과 값 범주 모두를 제약합니다.

대입 연산은 완전 함수일 필요가 없습니다. 특히, 어떤 객체 x 에 대입하는 것이 다른 객체 y 를 수정할 수 있는 경우, x = y = 의 정의역에 포함되지 않을 가능성이 높습니다. 이는 일반적으로 우측 피연산자가 좌측 피연산자에 직접적 또는 간접적으로 소유된 경우 발생합니다 (예: 노드 기반 데이터 구조의 스마트 포인터, 또는 std:: vector < std:: any > 와 같은 경우).