> 백엔드 개발 > C++ > C에서 이동 전용 유형을 사용하여 벡터를 올바르게 초기화하는 방법은 무엇입니까?

C에서 이동 전용 유형을 사용하여 벡터를 올바르게 초기화하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-17 16:06:11
원래의
839명이 탐색했습니다.

How to Correctly Initialize a Vector with Move-Only Types in C  ?

이동 전용 유형을 사용한 벡터 초기화

std::unique_ptr 인스턴스를 사용하여 벡터를 초기화하는 것을 목표로 하는 다음 코드를 고려하세요.

#include <vector>
#include <memory>

int main() {
  using move_only = std::unique_ptr<int>;
  std::vector<move_only> v{move_only(), move_only(), move_only()};
}
로그인 후 복사

그러나 이 코드는 GCC에서 컴파일하는 동안 오류를 유발합니다. 4.7, std::unique_ptr은 복사를 지원하지 않으며 컴파일러는 초기화 중에 포인터의 복사본을 만들려고 시도합니다.

GCC의 동작

GCC의 복사 시도 현재 C 표준에서는 포인터가 올바른 것으로 간주될 수 있습니다. 이는 다음과 같은 이동 전용 유형에 대한 목록 초기화 시나리오를 명시적으로 다루지 않습니다. Unique_ptr.

대체 초기화 방법

이동 전용 유형으로 벡터를 올바르게 초기화하려면 다음 접근 방식을 사용할 수 있습니다.

반복자 사용:

이 접근 방식에는 이동 반복자를 만드는 것이 포함됩니다. 초기화 목록에 대해 이를 벡터 생성자에 전달합니다:

#include <iterator>
#include <vector>
#include <memory>

int main() {
  using move_only = std::unique_ptr<int>;
  move_only init[] = {move_only(), move_only(), move_only()};
  std::vector<move_only> v{std::make_move_iterator(std::begin(init)),
                           std::make_move_iterator(std::end(init))};
}
로그인 후 복사

rref_wrapper 사용:

이 기술은 이동 참조를 위한 임시 저장소를 제공하는 도우미 유형을 사용합니다. :

#include <utility>
#include <type_traits>

template<class T>
struct rref_wrapper
{
  explicit rref_wrapper(T&& v) : _val(std::move(v)) {}
  explicit operator T() const { return T{std::move(_val)}; }

private:
  T&& _val;
};

template<class T>
typename std::enable_if<!std::is_lvalue_reference<T>::value,
                         rref_wrapper<T>&>::type
rref(T&& v) {
  return rref_wrapper<T>(std::move(v));
}

template<class T>
void rref(T&) = delete;

int main() {
  using move_only = std::unique_ptr<int>;
  std::initializer_list<rref_wrapper<move_only>> il{rref(move_only()),
                                                  rref(move_only()),
                                                  rref(move_only())};
  std::vector<move_only> v(il.begin(), il.end());
}
로그인 후 복사

위 내용은 C에서 이동 전용 유형을 사용하여 벡터를 올바르게 초기화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿