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

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

Patricia Arquette
Patricia Arquette원래의
2024-12-26 00:49:09962검색

Can You Move Elements Out of a 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));   // kosher?
    }
}

여기서 이것이 가능한지 확인하고 싶습니다. 요소를 밖으로 이동 std::initializer_list.

놀랍게도 대답은 '아니오'입니다. std::move(*it) 표현식은 이동을 초래하지 않습니다. 대신 T const && 유형의 불변 rvalue 참조를 생성합니다. 이는 초기화_목록의 시작 및 종료 메소드가 이동 의미 체계를 허용하지 않는 const T *를 반환하기 때문입니다.

이에 대한 가능한 이유는 컴파일러가 초기화_목록을 정적으로 초기화된 상수로 생성할 수 있도록 하기 위한 것입니다. 그러나 컴파일러의 재량에 따라 시작 및 끝 반환이 초기화_목록 또는 const 초기화_목록이 되도록 하는 것이 더 직관적입니다.

추가 고려 사항

ISO 제안은 다음과 같습니다. 이동 전용 유형에 대한 초기화_목록 지원을 제공하기 위해 만들어졌습니다. 이 제안은 아직 초기 단계이지만 여기에서 제기된 문제를 해결합니다.

위 내용은 std::initializer_list에서 요소를 이동할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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