katte
개발새발 우주정복기
katte
전체 방문자
오늘
어제
  • 분류 전체보기 (73)
    • 블로그 소개 (1)
    • Computer (36)
      • 자료구조 (0)
      • 알고리즘&백준 (19)
      • 컴퓨터구조 (0)
      • C++ (17)
      • Kotlin (0)
    • EE (29)
      • Verilog (22)
      • 디지털 시스템 (2)
      • 집적회로설계 (1)
      • 임베디드 시스템 (4)
    • 토이프로젝트 (3)
    • 기타 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • c++ 입출력
  • C++ 스트림 클래스
  • ctime
  • 표준스트림
  • C++11
  • c++
  • C++ 스트림 개요
  • Get
  • 입력버퍼
  • for 루프
  • 배열포인터
  • cctype
  • EOF
  • 스트림
  • 함수포인터
  • cin
  • C언어
  • ignore

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
katte

개발새발 우주정복기

Computer/C++

[C++] value categories

2022. 11. 17. 13:21

https://en.cppreference.com/w/cpp/language/value_category

 

Value categories - cppreference.com

Each C++ expression (an operator with its operands, a literal, a variable name, etc.) is characterized by two independent properties: a type and a value category. Each expression has some non-reference type, and each expression belongs to exactly one of th

en.cppreference.com

 

 

 

C++의 value는 크게 glvalue와 rvalue로 구분된다. 

 

glvalue에는 lvalue와 xvalue가 포함되며, rvalue에는 prvalue와 xvalue가 포함된다. 

 

 

 

value의 두가지 특성

 

  • identity 있음: expression이 다른 어떤 expression과 동일한 entity를 참조하는지의 여부를 알 수 있음. (그들이 식별하는 객체나 함수의 주소를 직간접적으로 비교함으로써)
  • 이동 가능: 이동 생성자, 이동 대입 연산자, 혹은 그 외에 이동 시맨틱을 구현하기 위한 오버로딩 함수가 expression을 바인딩할 수 있음. 

 

 

identity가 있는 value를 glvalue, 이동 가능한 value를 rvalue라고 한다.

 

  이동 가능 이동 불가능  
identity 있음 xvalue lvalue glvalue
identity 없음 prvalue 사용X  
  rvalue    

(C++17 이전)

 

 

 

glvalue는 lvalue-rvalue, 배열-포인터, 함수-포인터의 암시적 변환을 통해 prvalue로 암시적으로 변환될 수 있다.

glvalue는 다형성을 가질 수 있다. glvalue 객체의 동적 타입이 반드시 표현식의 정적 타입이 되지는 않는다. (?)

glvalue는 expression이 허용하는 경우 불완전한 타입을 가질 수 있다.

 

rvalue의 주소는 주소 연산자를 통해 얻어낼 수 없다. 

&int(), &i++[3], &42, &std::move(x) 등은 허용되지 않는다. 

rvalue는 대입 연산에서 좌측값으로 사용될 수 없다. 

rvalue는 const lvalue 참조를 초기화하기 위해 사용될 수 있으며, 이 경우 rvalue 객체의 수명은 참조가 끝날 때까지 연장된다.

const lvalue 참조 매개변수와 rvalue 참조 매개변수를 가진 함수가 오버로딩 되어있는 경우 rvalue는 rvalue 참조에 바인딩된다. (따라서 복사 생성자와 이동 생성자를 모두 사용할 수 있는 경우 rvalue는 이동 생성자를 호출함)

 

 


 

entity: 단일의 식별 가능한 분리된 개체.

value, 객체, 참조, 구조화 바인딩, 함수, 열거자, 타입, 클래스 멤버, 템플릿, 템플릿 특수화, 매개변수 팩, 네임스페이스 포함. 전처리기 매크로는 C++의 entity가 아님

 

expression: 일련의 연산자와 피연산자, 계산을 열거함

expression의 값을 구하는 것은 side effect를 가져옴. ex) a=2+2의 값을 구하는 것이 a에 4가 저장되는 결과를 가져옴. printf(%d, 4)의 값을 구하는 것이 표준출력에 4가 출력되는 결과를 가져옴. (evaluate는 수학에서 값을 구하다라는 의미로 쓰임 특히 evaluate the expression이라고 하면 식의 값을 구하라는 뜻임)

expression은 두 가지의 독립된 특성을 가질 수 있는데, type과 value category임. 

 


 

저작자표시 (새창열림)

'Computer > C++' 카테고리의 다른 글

[C++] 템플릿 클래스만 쓰면 링크 에러가 나는 이유가 뭘까  (0) 2022.11.26
[C++] 스마트 포인터 클래스  (0) 2022.11.20
[C++] rvalue 참조와 move semantics  (0) 2022.11.16
[C++] 함수 포인터 정리  (0) 2022.11.11
[C++] 배열 포인터 정리  (0) 2022.11.11
    'Computer/C++' 카테고리의 다른 글
    • [C++] 템플릿 클래스만 쓰면 링크 에러가 나는 이유가 뭘까
    • [C++] 스마트 포인터 클래스
    • [C++] rvalue 참조와 move semantics
    • [C++] 함수 포인터 정리
    katte
    katte
    개발새발 코딩하는 블로그 / HW 위주

    티스토리툴바