> 백엔드 개발 > C++ > C의 임시 하위 개체에 대한 Const 참조를 바인딩하는 것이 버그입니까, 아니면 예상된 동작입니까?

C의 임시 하위 개체에 대한 Const 참조를 바인딩하는 것이 버그입니까, 아니면 예상된 동작입니까?

Linda Hamilton
풀어 주다: 2024-10-26 11:26:29
원래의
909명이 탐색했습니다.

Is Binding a Const Reference to a Temporary Sub-Object in C   a Bug or Expected Behavior?

임시 하위 개체에 Const 참조 바인딩: 수수께끼

아래 C 코드 조각은 서로 다른 컴파일러 간의 동작 불일치를 보여줍니다. 임시 개체의 하위 개체에 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;  // Bind a reference to temporary's x member
    printf("x = %.18g\n", x); // Expected: 10
    return 0;
}</code>
로그인 후 복사

버그 또는 예상 동작?

g와 같은 컴파일러는 해당 개체의 수명을 종료합니다. main에 printf를 입력하기 전에 임시 P2d 인스턴스를 생성했지만 이중 멤버 x의 값은 여전히 ​​유지됩니다. 이는 원래 임시 멤버에 바인딩하는 대신 값을 복사하기 위해 다른 임시 이중을 생성함으로써 달성됩니다.

반면, clang은 x 참조의 수명과 일치하도록 P2d 임시 수명을 올바르게 연장하여 다음을 허용합니다. 소멸자는 main에서 printf 다음에 호출됩니다.

이러한 불일치는 다음과 같은 질문을 제기합니다. g의 동작은 버그입니까, 아니면 C 표준에서 허용됩니까?

분석 및 솔루션

CWG 1651은 이 문제에 대해 설명합니다.


하위 개체에 대한 참조를 바인딩하면 임시 개체의 수명이 연장되어서는 안 됩니다.


현재 표준에서는 클래스나 배열과 같은 스칼라 이외의 개체가 임시 개체의 수명을 연장할 수 있습니다.

컴파일러 동작

  • GCC: CWG 1651 해상도를 기반으로 클래스 또는 배열 하위 객체에 대해서만 수명을 연장합니다.
  • Clang: 이미 N3918에 설명된 수명 연장 규칙을 구현합니다. 이는 모든 임시 하위 개체의 수명을 연장합니다.

결론

C 표준의 현재 표현에 따르면 GCC의 동작은 기술적으로 정확하지만 Clang의 구현은 DR 1651에서 제안된 변경 사항을 반영합니다. 향후 이러한 변경 사항을 반영하기 위해 표준이 개정될 가능성이 높습니다.

위 내용은 C의 임시 하위 개체에 대한 Const 참조를 바인딩하는 것이 버그입니까, 아니면 예상된 동작입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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