> 백엔드 개발 > C++ > 본문

## 임시의 하위 개체에 대한 상수 참조를 바인딩하면 수명이 연장되나요?

DDD
풀어 주다: 2024-10-26 07:22:30
원래의
422명이 탐색했습니다.

## Does Binding a Const Reference to a Sub-Object of a Temporary Extend Its Lifetime?

임시 하위 개체에 대한 Const 참조 바인딩

다음 코드를 고려하세요.

<code class="cpp">#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>
로그인 후 복사

이 예에서는 center() 임시 P2d 개체를 반환합니다. 질문이 생깁니다: 이 임시 개체의 수명은 얼마나 됩니까?

컴파일러 동작의 차이점

각 컴파일러는 서로 다른 동작을 나타냅니다.

  • g (버전 5.2.0)은 main에 printf를 입력하기 전에 임시 P2d 개체를 삭제합니다. 그러나 x 멤버의 값은 유지됩니다. 특히 하위 개체가 클래스 또는 배열 유형인 경우에만 임시 개체의 수명을 연장합니다.
  • clang 은 임시 P2d 개체의 수명을 x 참조의 수명까지 연장합니다. 따라서 소멸자는 main의 printf 다음에 호출됩니다.

C 표준에 따르면 임시 항목의 하위 개체에 대한 참조를 바인딩해도 임시 항목의 수명이 연장되지 않습니다. . 그러나 이는 그러한 경우 수명을 연장하는 변경을 제안하는 CWG 1651에 포함됩니다.

계류 중인 결의안

현재 상태에서는 prvalue만 임시 항목을 참조하는 것으로 간주됩니다. 그러나 center().x와 같은 멤버 액세스 표현식은 g 및 clang 모두에서 prvalue로 간주됩니다.

  • g 는 스칼라 하위 객체를 사용할 때 수명을 연장하지 않습니다. 왜냐하면 [dcl .init.ref]/(5.2.1.1)에서는 이를 다루지 않습니다.
  • clang은 이미 "새로운" 수명 연장 규칙을 구현하고 있으며, 이는 CWG 1651이 해결되면 올바른 동작이 됩니다. .

향후 결의안에서는 멤버 액세스 표현식이 임시 표현식을 생성하고 이러한 표현식에 대한 참조를 바인딩하면 해당 임시 개체의 수명이 연장된다는 점을 명확히 할 것입니다.

위 내용은 ## 임시의 하위 개체에 대한 상수 참조를 바인딩하면 수명이 연장되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!