Namespaces
Variants

std::uninitialized_move_n

cppreference.net에서
 
 
알고리즘 라이브러리
제약된 알고리즘 및 범위에 대한 알고리즘 (C++20)
제약된 알고리즘, 예: ranges::copy, ranges::sort, ...
정렬 및 관련 연산
분할 연산
(C++11)    

정렬 연산
이진 검색 연산
(분할된 범위에 대해)
집합 연산 (정렬된 범위에 대해)
병합 연산 (정렬된 범위에 대해)
힙 연산
최소/최대 연산
(C++11)
(C++17)
사전식 비교 연산
순열 연산


 
 
헤더 <memory>
template< class InputIt, class Size, class NoThrowForwardIt >
std::pair<InputIt, NoThrowForwardIt>
    uninitialized_move_n( InputIt first, Size count,
                          NoThrowForwardIt d_first );
에 정의됨 (1) (C++17부터)
(C++26부터 constexpr)
template< class ExecutionPolicy,
          class ForwardIt, class Size, class NoThrowForwardIt >
std::pair<ForwardIt, NoThrowForwardIt>
    uninitialized_move_n( ExecutionPolicy&& policy, ForwardIt first,
                          Size count, NoThrowForwardIt d_first );
(2) (C++17부터)
1) d_first에서 시작하는 소스 범위의 처음 count 요소들로부터 first에서 시작하는 대상 범위에 요소들을 마치 다음처럼 생성합니다:

for (; count > 0; ++d_first, (void) ++first, --count)
    ::new (voidify(*d_first))
        typename std::iterator_traits<NoThrowForwardIt>::value_type(deref-move(*iter));
return {first, d_first};

초기화 중 예외가 발생하면, first + [0, count)의 일부 객체는 유효하지만 명시되지 않은 상태로 남아 있으며, 이미 생성된 객체들은 명시되지 않은 순서로 소멸됩니다.
2) (1)과 동일하지만, policy에 따라 실행됩니다.
이 오버로드는 다음 표현식의 값이 true인 경우에만 오버로드 해결에 참여합니다:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(C++20까지)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(C++20부터)


만약 d_first + [0, count)이 first + [0, count)와 겹치는 경우, 동작은 정의되지 않습니다.

(C++20부터)

매개변수

first - 이동할 요소 범위의 시작
d_first - 대상 범위의 시작
count - 이동할 요소의 개수
policy - 사용할 실행 정책
타입 요구사항
-
InputIt 는 LegacyInputIterator 요구사항을 충족해야 함
-
ForwardIt 는 LegacyForwardIterator 요구사항을 충족해야 함
-
NoThrowForwardIt 는 LegacyForwardIterator 요구사항을 충족해야 함
-
NoThrowForwardIt 의 유효한 인스턴스를 통한 증가, 할당, 비교, 간접 참조 연산은 예외를 발생시켜서는 안 됨

반환값

위에서 설명한 바와 같습니다.

예외

2) 실행 과정 중:
  • 병렬화에 필요한 임시 메모리 자원을 사용할 수 없는 경우, std::bad_alloc가 throw됩니다.
  • 알고리즘 인수를 통해 객체에 접근하는 동안 처리되지 않은 예외가 발생하면, 동작은 실행 정책에 따라 결정됩니다 (표준 정책의 경우, std::terminate가 호출됩니다).

참고

입력 반복자가 rvalue로 역참조될 때, std::uninitialized_move_n의 동작은 std::uninitialized_copy_n와 같습니다.

기능 테스트 매크로 값 표준 기능
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr을 위한 특수화된 <memory> 알고리즘, (1)

가능한 구현

template<class InputIt, class Size, class NoThrowForwardIt>
constexpr std::pair<InputIt, NoThrowForwardIt>
    uninitialized_move_n(InputIt first, Size count, NoThrowForwardIt d_first)
{
    using ValueType = typename std::iterator_traits<NoThrowForwardIt>::value_type;
    NoThrowForwardIt current = d_first;
    try
    {
        for (; count > 0; ++first, (void) ++current, --count) {
            auto addr = static_cast<void*>(std::addressof(*current));
            if constexpr (std::is_lvalue_reference_v<decltype(*first)>)
                ::new (addr) ValueType(std::move(*first));
            else
                ::new (addr) ValueType(*first);
        }
    {
    catch (...)
    {
        std::destroy(d_first, current);
        throw;
    }
    return {first, current};
}
**참고**: 제공된 웹페이지 내용은 C++ 코드 블록으로 구성되어 있으며, 지시사항에 따라 ` `, `
`, `` 태그 내의 텍스트와 C++ 관련 용어는 번역하지 않았습니다. HTML 태그와 속성도 원본 그대로 유지했습니다. 코드 외의 설명 텍스트가 없으므로 번역할 내용이 존재하지 않습니다.

예제

#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <memory>
#include <string>
void print(auto rem, auto first, auto last)
{
    for (std::cout << rem; first != last; ++first)
        std::cout << std::quoted(*first) << ' ';
    std::cout << '\n';
}
int main()
{
    std::string in[]{"One", "Definition", "Rule"};
    print("initially, in: ", std::begin(in), std::end(in));
    if (constexpr auto sz = std::size(in);
        void* out = std::aligned_alloc(alignof(std::string), sizeof(std::string) * sz))
    {
        try
        {
            auto first{static_cast<std::string*>(out)};
            auto last{first + sz};
            std::uninitialized_move_n(std::begin(in), sz, first);
            print("after move, in: ", std::begin(in), std::end(in));
            print("after move, out: ", first, last);
            std::destroy(first, last);
        }
        catch (...)
        {
            std::cout << "Exception!\n";
        }
        std::free(out);
    }
}

가능한 출력:

initially, in: "One" "Definition" "Rule" 
after move, in: "" "" "" 
after move, out: "One" "Definition" "Rule"

결함 보고서

다음 동작 변경 결함 보고서는 이전에 발행된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 발행 시 동작 올바른 동작
LWG 3918 C++17 이동 생성은 항상 수행되며, 심지어
이동 생성 없음
이 경우에

참고 항목

객체 범위를 초기화되지 않은 메모리 영역으로 이동
(함수 템플릿)
지정된 개수의 객체를 초기화되지 않은 메모리 영역으로 복사
(함수 템플릿)
지정된 개수의 객체를 초기화되지 않은 메모리 영역으로 이동
(알고리즘 함수 객체)