반환된 std::initializer_list 배열의 수명
함수에서 반환된 std::initializer_list 배열의 수명은 다른 컴파일러에서의 동작. 반환 전체 표현이 끝날 때 GCC의 배열 파괴가 올바른지 의문이 생깁니다.
표준 분석
C 11 §6.6에 따르면. 3/2, 중괄호 초기화 목록이 있는 반환 문은 반환된 개체 또는 참조가 초기화 목록에서 복사 목록 초기화되도록 유도합니다. 이 프로세스는 초기화 목록에서 임시 초기화_목록 개체와 해당 기본 배열 저장소를 초기화한 다음 다른 초기화_목록을 처음부터 초기화합니다.
8.5.4/6에 정의된 배열의 수명은 초기화_목록 개체의 수명입니다. 이는 초기화_목록 개체와 배열이 중괄호 초기화 목록으로 초기화된 std::벡터에 대한 전체 표현식 수명을 갖는 예를 통해 이해할 수 있습니다.
Braceed-Init의 반환 값 -List
중괄호로 묶인 베어 리스트가 반환될 때 copy-list-initialization이 사용됩니다. 이는 복사를 포함하지 않고 배열의 수명이 연장된 8.5.4/6의 예와 동일한 nocopy X = { 3 } 구문과 유사합니다.
GCC 관련 문제 and Clang
단, GCC와 Clang의 구현에는 차이가 있습니다. GCC는 반환하기 전에 배열을 삭제하는 반면 Clang은 명명된 초기화 목록을 유지하지만 목록에 있는 개체는 절대 삭제하지 않습니다.
권장사항
std::를 사용하지 않는 것이 좋습니다. 초기화를 수행하여 값이 지속되기를 기대하면서 값을 전달합니다. 표준 및 컴파일러 구현의 불확실성으로 인해 개체 수명을 보존하는 데 신뢰할 수 없습니다.
위 내용은 GCC가 반환된 `std::initializer_list` 배열을 파괴하는 것이 맞나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!