2016-12-16 8 views
27

쓰기 const auto& [a, b] = f();f()에서 반환 된 개체의 수명을 연장하거나 최소한 ab의 개체에 바인딩됩니까? 읽기를 통해 the proposal 나는 그게 뭔가 다른 것으로 덮여 있지 않는 한 그 언어가 확실하게 보이지 않는 것을 보지 못합니다. 그러나, 다음은 임시의 수명을 연장하지 않는, 그래서 나는이 적용됩니다 표시되지 않습니다 :이 덮여 제안 보인다 용지의 상단구조화 된 바인딩에서 const 참조는 분해 된 객체의 수명을 연장합니까?

const auto& a = std::get<0>(f()); 

이력서 - 예선 및 분해 선언의 REF-규정이 초기화 도입 기준에 적용이 아닌 개별 구성원에 대한

그러나 실제 표준, 가장 가까운 언급에 대한 제안 표현에 별칭 나는 볼 수있다. 전자는 식별자 목록에서 도입 좌변 또는 참조 의 이름을 지정 호로 -이지 않은 ID를 표현 인 경우

: 내가 찾고 있어요 보증을 얻기 위해 읽을하는 방법을 잘 모르겠지만, w 분해 선언 decltype (E)는 명세서에서이 범위의 단부에 기초까지 GCC와 연타 두 개체의 수명을 연장 반환 보인다 분해 선언

을 주어진 참조 타입 a wandbox experiment. uglier one 내 유형의 모든 종소리와 휘파람을 구현하면 외부 객체와 다른 데이터 멤버의 수명이 연장되는 것으로 보입니다.

저자의 의도는 거의 확실하지만 언어가 이것이 안전하다는 것을 확실히 알고 싶습니다.

답변

17

예. 그 트릭은 외모에도 불구하고 [ 이전의 구조화 된 바인딩 선언 부분이 식별자 목록의 이름에는 적용되지 않는다는 것을 인식하는 것입니다. 그들은 선언에 의해 암시 적으로 도입 된 변수에 대신 적용됩니다. [dcl.struct.bind]/1 :

먼저 고유 한 이름이 e 인 변수가 도입되었습니다. 이니셜에서 할당 표현이 어레이 형 A을 가지며 더 REF - 규정ecv A 입력 가지며, 존재하지 않고 각 요소 복사 초기화 또는이면 의 해당 요소 로부터 직접 초기화 할당 표현이니셜 라이저의 형식으로 지정됩니다.그렇지 e 정의 그대로 경우

의한 특성 지정자-SEQ 옵트 않거나 계산 지정자-SEQ REF- 규정 옵트 e 이니셜; 선언 함수 선언 및가 가 대응 구성 바인딩 선언에서 촬영 된 선언자-ID 이외 선언의 부품으로 해석되지 않는다

.

이름은 다음에 eget 호출의 결과에 결합한 e 요소 또는 참조 별칭으로 하나 정의된다. (f이 두 요소 std::tuple 반환 가정)에 의한 경우로 예에서

, 그것은 다음과 같습니다. (그 decltype(a)를 제외하고 decltype(b)가 referenceness을 숨길 수있는 특별 대우를 얻는다)

const auto& e = f(); // 1 
using E = remove_reference_t<decltype((e))>; 
std::tuple_element<0, E>::type& a = get<0>(e); 
std::tuple_element<1, E>::type& b = get<1>(e); 

라인 # 1이 f의 반환 값 수명을 연장한다는 것은 꽤 분명해야합니다.