std:: assignable_from
|
헤더 파일에 정의됨
<concepts>
|
||
|
template
<
class
LHS,
class
RHS
>
concept assignable_from
=
|
(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]
-
18.4.8 Concept
- C++20 표준 (ISO/IEC 14882:2020):
-
-
18.4.8 Concept
assignable_from[concept.assignable]
-
18.4.8 Concept
참고 항목
|
(C++11)
(C++11)
(C++11)
|
특정 인자에 대한 할당 연산자를 가지는지 확인
(클래스 템플릿) |