Namespaces
Variants

std:: assignable_from

From cppreference.net
헤더 파일에 정의됨 <concepts>
template < class LHS, class RHS >

concept assignable_from =
std:: is_lvalue_reference_v < LHS > &&
std:: common_reference_with <
const std:: remove_reference_t < LHS > & ,
const std:: remove_reference_t < RHS > & > &&
requires ( LHS lhs, RHS && rhs ) {
{ lhs = std:: forward < RHS > ( rhs ) } - > std:: same_as < LHS > ;

} ;
(C++20부터)

assignable_from<LHS, RHS> 개념은 RHS 에 지정된 타입과 값 범주를 가진 표현식을 LHS 에 지정된 타입을 가진 lvalue 표현식에 할당할 수 있음을 명시합니다.

목차

의미론적 요구사항

주어진

  • lhs , 객체를 참조하는 lvalue로 lcopy 객체에 대해 decltype ( ( lhs ) ) LHS 인 경우,
  • rhs , 표현식으로 decltype ( ( rhs ) ) RHS 인 경우,
  • rcopy , rhs 와 동일한 값을 가지는 별개의 객체,

assignable_from<LHS, RHS> 는 다음 조건에서만 모델됩니다

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

동등성 보존

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

참고 사항

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

예제

#include <atomic>
#include <concepts>
#include <string>
int main()
{
    // 일반적인 기본 사용법, lvalue 참조 할당을 검사함
    static_assert(std::is_assignable_v<int&, int>);
    static_assert(std::assignable_from<int&, int>);
    static_assert(std::is_assignable_v<std::string&, std::string>);
    static_assert(std::assignable_from<std::string&, std::string>);
    // 기본 타입은 rvalue에 대한 할당을 지원하지 않음
    static_assert(!std::is_assignable_v<int, int>);
    static_assert(!std::assignable_from<int, int>);
    // std::assignable_from은 모든 유효한 할당 표현식을 허용하지 않음:
    // rvalue 참조 할당
    static_assert(std::is_assignable_v<std::string&&, std::string>);
    static_assert(!std::assignable_from<std::string&&, std::string>);
    // rvalue 할당
    static_assert(std::is_assignable_v<std::string, std::string>);
    static_assert(!std::assignable_from<std::string, std::string>);
    // std::atomic::operator=은 값으로 반환함
    static_assert(std::is_assignable_v<std::atomic<int>&, int>);
    static_assert(!std::assignable_from<std::atomic<int>&, int>);
}

참조문헌

  • C++23 표준 (ISO/IEC 14882:2024):
  • 18.4.8 Concept assignable_from [concept.assignable]
  • C++20 표준 (ISO/IEC 14882:2020):
  • 18.4.8 Concept assignable_from [concept.assignable]

참고 항목

특정 인자에 대한 할당 연산자를 가지는지 확인
(클래스 템플릿)