질문: GCC 구현이 a를 파괴하는 것이 맞습니까? std::initializer_list 배열 반환 전체 표현식의 끝에서 함수에서 반환되었습니까?
답변: 아니요, 이는 올바르지 않습니다.
C 11 표준에 따르면 중괄호 초기화 목록이 포함된 return 문은 지정된 초기화 목록에서 복사 목록 초기화에 의해 반환될 객체 또는 참조를 초기화합니다. 초기화 목록을 사용하여 초기화 목록 객체를 생성하면 목록의 요소를 저장하기 위해 배열이 할당됩니다. 배열의 수명은 다음과 같이 정의됩니다.
배열의 수명은 초기화_목록 개체의 수명과 동일합니다.
제공된 예에서 초기화_목록 개체는 반환으로 생성됩니다. send() 함수의 값입니다. 이는 세 개의noisydt 객체로 초기화된 다음 receive() 함수로 반환됩니다. 초기화_목록 객체와 연관된 배열의 수명은 receive() 함수로 확장되어 목록의 요소에 액세스하고 사용할 수 있도록 해야 합니다.
그러나 GCC 구현은 반환 값 전에 배열을 잘못 파괴합니다. 사용할 수 있으므로 정의되지 않은 동작이 발생합니다. 올바른 동작은 receive() 함수가 끝날 때까지 배열이 지속되는 것입니다. Clang과 ICC 모두 올바른 동작을 보여줍니다.
GCC 구현의 std::initializer_list 반환 값 처리는 C 11 표준을 따르지 않습니다. Clang과 ICC는 올바른 구현을 제공하며 std::initializer_lists로 작업할 때 이러한 컴파일러를 사용하는 것이 좋습니다.
위 내용은 GCC는 전체 표현식 반환이 끝나기 전에 함수에서 반환된 `std::initializer_list` 배열을 파괴합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!