임시 하위 개체에 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은 이 문제에 대해 설명합니다.
하위 개체에 대한 참조를 바인딩하면 임시 개체의 수명이 연장되어서는 안 됩니다.
현재 표준에서는 클래스나 배열과 같은 스칼라 이외의 개체가 임시 개체의 수명을 연장할 수 있습니다.
컴파일러 동작
결론
C 표준의 현재 표현에 따르면 GCC의 동작은 기술적으로 정확하지만 Clang의 구현은 DR 1651에서 제안된 변경 사항을 반영합니다. 향후 이러한 변경 사항을 반영하기 위해 표준이 개정될 가능성이 높습니다.
위 내용은 C의 임시 하위 개체에 대한 Const 참조를 바인딩하는 것이 버그입니까, 아니면 예상된 동작입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!