C에서 std::initializer_list
아래 코드 조각에서 foo 함수는 초기화 목록을 인수로 받아들입니다.
#include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // Intended to move the element } }
std::initializer_list
안타깝게도 이음매 없는 요소 움직임에 대한 기대는 근거가 없습니다. 초기화 목록에서 요소를 이동하려고 하면 예상치 못한 결과가 발생합니다. 요소를 재배치하는 대신 복사본이 생성됩니다. 이 동작은 std::initializer_list
결과적으로 bar(std::move(*it))에 사용된 이동 표현식은 T 유형의 함수 매개변수에 바인딩됩니다. const &, 효과적으로 복사본을 보존합니다.
이 제한의 이유는 인스턴스화에 대한 컴파일러의 특권에 기인합니다. std::initializer_list는 정적으로 초기화된 상수입니다. 시작과 끝에서 변경 가능한 결과를 허용하면 이러한 최적화가 방해되어 컴파일러 설계가 복잡해집니다.
예상치 못한 동작에도 불구하고 해결책이 곧 나올 수도 있습니다. [ISO 제안](https://github.com/CaseyCarter/iso-changes/blob/master/icpp/p1716r4.md)에서는 이동 전용 유형에 대한 초기화 목록 지원을 도입하려고 합니다. 이러한 노력의 목표는 언어의 기능을 향상시키고 이니셜라이저 목록 및 이동 의미론 작업에 대한 보다 일관된 접근 방식을 제공하는 것입니다.
위 내용은 C의 `std::initializer_list`에서 요소를 안전하게 이동할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!