[Modern C++] reference collapsing

Program Lang./C++ 2019. 7. 31. 14:22

1. reference collapsing 이란?

 

type deduction 과정에서 유도된 reference와 원본 expression이 가지고 있는 reference가 충돌하는 것을 말한다.

위의 문장으로는 어떤 의미인지 마음에 와 닿지 않는다. 예제를 하나 살펴보면

 

auto& rx = x;

예제가 이상하기는 하지만 x 가 int lvalue reference라고 한다면,

auto -> int&로 유도된다.

auto를 int&로 치환하면, 아래와 같고 결국 reference와 reference가 충돌하는 상황이 발생한다.

int& & rx = x;


2. reference collapsing 세가지 유형

 

reference collapsing이 발생하는 상황은 크게 아래 세가지 경우에 해당한다.

  • template
  • auto
  • decltype

3. reference collaping 처리 규칙

 

"lvalue reference 이면 최종 결과는 lvalue reference, rvalue reference이면 최종 결과는 rvalue reference"

 

4. perfect forwarding

 

reference collapsing 규칙은 perfect forwarding 이해하는데 핵심 규칙으로 보인다.

perfect forward의 핵심인 forward 기술을 가지고 reference collasping 적용 규칙을 살펴본다.

 

 

아래 표에 main함수에서 예시한 예제에 대해서 reference collapsing 과정을 기술하였다.

표를 통해서 reference collapsing 규칙을 이해하는데 어렵지 않을 것이다.

 

reference collasing설명에서 perfect forwarding이라는 머나먼 주제로 이동한 느낌이지만

reference collasping 주제를 통해서 perfect forwarding 기술이 무엇인지 알 수 있다.

 

perfect forwarding은 somefunction까지 매개변수가 전달되는 과정에서 원래 f 함수에 전달된

함수의 매개변수 reference 속성이 변경되지 않는 기술로 요약할 수 있다.

Case reference collapsing final result

Widget w;

f(w);

lvalue reference로 유도, T : Widget&

Widget & && (Widget& param)

{

    return static_cast<Widget & &&>(param);

}

reference collasping 규칙 적용,

Widget(Widget& param)

{

    return static_cast<Widget&>(param);

}

f(Widget());

rvalue reference로 유도, T : Widget

Widget && (Widget& param)

{

    return static_cast<Widget &&>(param);

}

reference collasping 규칙 적용,

Widget&& (Widget& param)

{

    return static_cast<Widget&&>(param);

}

 

5. reference collasing 추가 고려 사항

 

아래 코드는 책에 존재하는 코드로

RvalueRefToT 변수는 Rvalue Reference로 사용을 위해서 typedef한 경우라고하면,

실제 type deduction 과정에서 reference collasping 과정을 거치고 나면

RvalueRefToT 변수는 lvalue reference로 정의되어진다.

 

reference collasping에 대한 정확한 이해를 바탕으로 구현이 필요함을 보여주는 예제이다. 

 

 

5. 정리

 

reference collasping은 perfect forwarding을 이해하는데 핵심 요소로 보여진다.

c++11을 정리하다보면 각자 다른 주제인 것 같지만, 결국 모두 상호 엮여있어서

다른 것을 이해하는데 각 요소의 정확한 이해가 필요해 보인다. 

 

: