이동 전용 유형을 사용한 벡터 초기화
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!