std::initializer_list에서 요소를 이동할 수 있나요?
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)); // Safe? } }
예상과 달리 std::initializer_list에서 요소를 이동하려고 하면 대신 복사본이 생성됩니다. 이는 특별한 컴파일러 처리가 필요하고 일반적인 컨테이너의 값 의미 체계가 부족한 std::intializer_list의 고유한 특성으로 인해 발생합니다.
이 문제는 std의 반환 유형인 start() 및 end()에 있습니다. ::initializer_list, 이는 const T 입니다. 따라서 'std::move(it)' 표현식은 효과적으로 이동할 수 없는 불변 rvalue 참조(T const &&&)를 생성합니다. 이는 rvalue가 const lvalue 참조에 바인딩되어 복사 의미 체계가 발생하기 때문에 T const & 유형의 함수 매개 변수에 바인딩할 뿐입니다.
이 동작은 직관적이지 않은 것처럼 보일 수 있지만 컴파일러가 잠재적으로 초기화_목록을 정적으로 만들 수 있습니다. 초기화된 상수. 그럼에도 불구하고 이는 사용자가 Begin() 및 end()의 결과가 const인지 변경 가능한지 여부를 확신할 수 없는 불일치를 초래합니다.
위 내용은 `std::initializer_list`에서 요소를 이동할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!