>백엔드 개발 >C++ >## 임시의 하위 개체에 대한 상수 참조를 바인딩하면 C에서 수명이 연장됩니까?

## 임시의 하위 개체에 대한 상수 참조를 바인딩하면 C에서 수명이 연장됩니까?

DDD
DDD원래의
2024-10-26 04:20:02490검색

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

임시 하위 개체에 대한 상수 참조 바인딩 정보

C 코드에서는 다음과 같습니다.

<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>

임시 개체 센터()의 수명과 관련하여 컴파일러마다 다르게 동작합니다. GCC는 main에 printf를 입력하기 전에 임시 항목을 삭제하는 반면 Clang은 참조 x의 수명과 일치하도록 수명을 연장합니다. 그러나 x 및 y 멤버에 대한 사용자 정의 클래스 Double로 대체되면 두 컴파일러 모두 동의하고 임시 수명을 연장합니다.

표준 고려 사항

이 동작은 다음으로 해결됩니다. CWG 1651에서는 prvalue에 적용된 멤버 액세스 또는 첨자 표현식의 결과가 xvalue이며 임시 하위 객체에 대한 참조를 바인딩해도 수명이 연장되어서는 안 된다고 명시하고 있습니다. 두 컴파일러 모두 center().x를 prvalue로 처리하지만 CWG 1651에서 제안한 변경 사항을 완전히 구현하지는 않습니다.

컴파일러 차이점

GCC

  • 스칼라 하위 개체는 [dcl.init.ref]/(5.2.1.1)에서 임시 개체로 간주되지 않으므로 수명을 연장하지 않습니다.

Clang

  • 회원 액세스를 인식하고 캐스트 처리까지 이미 평생 연장 규칙을 구현합니다.

향후 표준 변경

DR 1651에 대한 보류 중인 해결 방법인 N3918에서는 멤버 표현식을 통해 임시에 액세스하면 수명이 연장되어야 함을 명확히 합니다. 일단 채택되면 이 변경 사항은 Clang의 동작을 표준에 맞게 조정합니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.