2016-10-26 4 views
7

C++ 11에서는 std :: tie에서 암시 적 변환이 허용됩니까?std :: tie에서 암시 적 변환이 허용됩니까?

다음 코드는 컴파일 및 실행되지만 장면의 뒤에서 무슨 일이 일어나고 있는지, 아니면 안전한지 확실하지 않습니다. 어떻게됩니까

std::tuple<float,float> foo() { return std::make_tuple(0,0); } 

double a, b; 
std::tie(a,b) = foo(); // a and b are doubles but foo() returns floats 

답변

14

는 튜플의 이동 할당 연산자의 템플릿 버전은 자신의 이동 할당의 의미를 사용하여 개별 튜플 구성원 하나 하나 움직임이-할당

template< class... UTypes > 
tuple& operator=(tuple<UTypes...>&& other); 

을 사용합니다. 해당 멤버가 암시 적으로 변환 가능한 경우 암시 적으로 변환됩니다.

이것은 기본적으로 우리가 이미 오랫동안 즐기고있는 std::pair에서 비슷한 기능을 자연스럽게 확장 한 것입니다.

+0

아마도 'UTypes ...'의 인수 공제 중 암시 적 변환이 무시되기 때문에 암시 적 변환이'operator ='본문에서 발생한다는 것을 언급하는 것이 좋습니다. – TemplateRex