>  기사  >  백엔드 개발  >  C 함수에서 반환된 Braced-Init-List의 수명은 얼마나 됩니까?

C 함수에서 반환된 Braced-Init-List의 수명은 얼마나 됩니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-29 18:29:22656검색

 What is the Lifetime of a Braced-Init-List Returned from a C   Function?

Braceed-Init-List 반환 값의 수명

C에서 함수에서 Braced-init-list를 반환하면 다음에 대한 질문이 제기됩니다. 초기화_목록 및 해당 기본 배열의 수명.

문제 개요

이전 분석에 따르면 GCC는 반환 표현식이 끝나기 전에 초기화_목록 배열을 잘못 종료하는 반면 Clang은 객체를 파괴하지 않고 잘못 보존합니다.

표준 해석

C 11 표준에 따르면 중괄호 초기화 목록이 있는 반환 문은 다음을 통해 반환 값을 초기화합니다. 사본 목록 초기화. 반환 유형이 std::initializer_list의 특수화인 경우 초기화_목록 객체는 지정된 목록에서 구성되고 초기화됩니다.

배열 수명

구성된 초기화_목록은 초기화 목록에서 초기화된 요소 배열에 대한 참조입니다. 배열의 수명은 초기화_목록 개체와 동일하도록 정의됩니다. 이는 return 문에서 기본 배열이 Braced-init-list에서 초기화되고 수명이 호출 범위까지 확장된다는 것을 의미합니다.

올바른 구현

따라서 예상되는 동작은 초기화_목록의 배열이 호출 함수에 유지되어 추가 사용이나 명명된 참조에 대한 바인딩을 허용해야 한다는 것입니다. 그러나 GCC의 현재 구현은 배열 할당을 조기에 해제하여 이러한 기대를 위반합니다.

추가 설명

  • braced-init-list를 반환한다고 해서 복사가 암시되지는 않습니다. 반환된 객체의 구성. 단순히 copy-list-initialization을 사용하여 반환 값을 초기화합니다.
  • DR 1290은 초기화_목록 수명과 관련된 문구를 수정했으며 DR 1565 및 1599도 고려 중이므로 추가 변경이 발생할 가능성이 있습니다.
  • initializer_list에 대한 추가 참조를 바인딩해도 기본 배열의 수명이 연장되지 않습니다. 이는 임시 개체에 대한 참조가 임시 개체의 수명을 연장하지 않는 것과 유사합니다.

위 내용은 C 함수에서 반환된 Braced-Init-List의 수명은 얼마나 됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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