초기화 목록 및 이동 의미 체계: 요소를 밖으로 이동할 수 있나요?
초기화 목록 및 이동 의미 체계의 사용과 관련하여 질문이 생깁니다. std::initializer_list
문제
다음 코드 조각을 고려하세요.
#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)); // kosher? } }
여기서 이것이 가능한지 확인하고 싶습니다. 요소를 밖으로 이동 std::initializer_list.
답
놀랍게도 대답은 '아니오'입니다. std::move(*it) 표현식은 이동을 초래하지 않습니다. 대신 T const && 유형의 불변 rvalue 참조를 생성합니다. 이는 초기화_목록의 시작 및 종료 메소드가 이동 의미 체계를 허용하지 않는 const T *를 반환하기 때문입니다.
이에 대한 가능한 이유는 컴파일러가 초기화_목록을 정적으로 초기화된 상수로 생성할 수 있도록 하기 위한 것입니다. 그러나 컴파일러의 재량에 따라 시작 및 끝 반환이 초기화_목록 또는 const 초기화_목록이 되도록 하는 것이 더 직관적입니다.
추가 고려 사항
ISO 제안은 다음과 같습니다. 이동 전용 유형에 대한 초기화_목록 지원을 제공하기 위해 만들어졌습니다. 이 제안은 아직 초기 단계이지만 여기에서 제기된 문제를 해결합니다.
위 내용은 std::initializer_list에서 요소를 이동할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!