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

GCC와 Clang 사이에서 `std::initializer_list` 반환 값의 수명이 다른 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-10-28 10:06:02
원래의
1048명이 탐색했습니다.

Why Does the Lifetime of an `std::initializer_list` Return Value Differ Between GCC and Clang?

std의 수명::initializer_list 반환 값: GCC 대 Clang 동작

제공된 코드에서 std를 반환합니다. ::initializer_list를 함수에서 삭제하고 예기치 않은 소멸자 동작을 관찰합니다. 특히 함수에서 반환된 배열은 해당 요소에 액세스하기 전에 삭제됩니다.

기본적인 문제는 C 표준에 따라 std::initializer_list에 다음과 같은 요소 배열이 있다는 사실에서 비롯됩니다. 초기화_목록과 동일한 수명으로 생성됩니다. 이는 기본적으로 함수의 return 문의 끝에서 배열이 삭제된다는 의미입니다.

GCC의 구현은 이 동작을 준수하지만 Clang은 그렇지 않습니다. Clang은 표준을 준수하지 않는 return 문의 끝 이후에도 배열의 수명을 유지합니다. 그러나 객체 소멸자가 호출되지 않기 때문에 Clang의 동작은 일관되지 않은 것처럼 보입니다.

Copy-List-Initialization 및 컴파일러 해석

braced-init- list는 copy-list-initialization을 통해 반환 값을 초기화합니다. 이는 기존 객체를 복사 초기화한다는 의미입니다. 이 경우 임시 초기화_목록 개체는 중괄호로 묶인 목록에서 복사 초기화됩니다. 그 후, 또 다른 초기화_목록 개체가 처음부터 복사 초기화됩니다.

표준에서는 배열의 수명이 초기화_목록 개체와 동일하다고 명시하고 있지만 초기화_목록의 복사본이 여러 개 생성되므로 어떤 개체의 수명이 결정되는지는 확실하지 않습니다. 배열의 수명.

GCC는 반환된 초기화_목록 개체의 수명을 고려하여 표준을 해석하므로 배열이 조기에 파기됩니다. 그러나 8.5.4/6에 제공된 예에서는 배열의 수명이 수신 함수를 포함하여 둘러싸는 표현식의 끝까지 연장되어야 함을 시사합니다.

컴파일러 동작 및 표준 모호성 요약

  • GCC: 표준을 따르고 return 문의 끝에서 배열을 삭제합니다.
  • Clang: return 문 이상으로 배열의 수명을 연장하지만 객체 소멸자를 제대로 삭제하지 못합니다.
  • 어느 초기화_목록 개체가 배열의 수명을 결정하는지에 대한 표준이 모호합니다.

권장

예기치 않은 동작을 방지하려면 일반적으로 권장되지 않습니다. 값으로 std::initializer_list를 반환합니다. 가변 개수의 객체를 전달해야 하는 경우 대신 std::Vector와 같은 컨테이너 클래스를 사용하는 것이 좋습니다.

위 내용은 GCC와 Clang 사이에서 `std::initializer_list` 반환 값의 수명이 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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