>백엔드 개발 >C++ >`std::initializer_list`에서 요소를 이동할 수 있나요?

`std::initializer_list`에서 요소를 이동할 수 있나요?

Linda Hamilton
Linda Hamilton원래의
2024-12-26 17:02:13677검색

Can I Move Elements from a `std::initializer_list`?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.