다음 코드 조각을 고려하세요.
<code class="c++">#include <stdio.h> struct P2d { double x, y; P2d(double x, double y) : x(x), y(y) {} ~P2d() { printf("Destructor called\n"); } }; P2d center() { return P2d(10, 10); } int main(int argc, const char *argv[]) { const double& x = center().x; printf("x = %.18g\n", x); return 0; }</code>
언제 GCC 5.2.0으로 컴파일된 경우 P2d 임시 인스턴스는 main에서 printf 호출을 시작하기 전에 삭제됩니다. 그럼에도 불구하고 x 값은 유지되고 올바르게 인쇄됩니다. 즉, x를 P2d 임시의 x 멤버에 직접 바인딩하는 대신 두 번째 임시 이중을 생성하여 멤버의 값을 복사합니다.
반면 Clang은 P2d 임시의 수명을 수명으로 연장합니다. x 참조의 결과로 main의 printf 다음에 소멸자가 호출됩니다.
이런 질문이 제기됩니다. 이 동작은 GCC의 버그인가요 아니면 표준에서 허용되는 것인가요?
CWG 1651은 이 문제를 해결합니다.
The resolution of issues 616 and 1213, making the result of a member access or subscript expression applied to a prvalue an xvalue, means that binding a reference to such a subobject of a temporary does not extend the temporary's lifetime. [class.temporary] should be revised to ensure that it does.
현재 [class.temporary]/5에서는 다음과 같이 명시합니다. "두 번째 컨텍스트는 참조가 임시에 바인딩되는 경우입니다. " 이는 임시 개체에 직접 바인딩되는 참조에만 적용되는 것으로 해석되었습니다. 따라서 위의 코드에서 center().x는 (Clang과 GCC 모두에 의해) prvalue로 처리되며 [class.temporary]/5는 적용되지 않습니다.
그러나 GCC와 Clang은 DR 1651, 즉 N3918의 해상도는 아직 구현되지 않았습니다. 이 해결 방법은 "임시 표현식에 적용된 멤버 액세스 및 아래 첨자 표현식은 임시 표현식을 생성합니다"라고 명시하고 "해당 임시 개체(있는 경우)는 참조 수명 동안 지속됩니다"라고 덧붙입니다.
따라서 N3918의 표현에 따르면 Clang은 의도한 동작을 구현하는 반면 GCC는 그렇지 않은 것으로 보입니다. DR 60297은 GCC가 [dcl.init.ref]/(5.2.1.1)에 포함되지 않기 때문에 임시의 스칼라 하위 객체에 대한 수명을 연장하지 않는다는 점을 지적합니다.
요약하자면, GCC의 현재 동작은 다음과 같습니다. 표준의 현재 표현에 따르면 정확하지만 이 경우 수명 연장을 요구하도록 표준이 개정될 가능성이 높습니다. Clang은 이미 예상되는 향후 동작을 구현하고 있습니다.
위 내용은 ## 임시 개체의 하위 부분에 대한 상수 참조를 바인딩하면 수명이 연장되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!