>백엔드 개발 >C++ >C의 `std::initializer_list`에서 요소를 안전하게 이동할 수 있습니까?

C의 `std::initializer_list`에서 요소를 안전하게 이동할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-19 15:03:15328검색

Can We Safely Move Elements from a `std::initializer_list` in C  ?

std::initializer_list에서 요소 이동

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 const T *를 반환하면 T const &&로 표시된 불변 rvalue 참조가 생성됩니다.

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

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