Namespaces
Variants

std::move_if_noexcept

cppreference.net에서
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 폐지됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
교체 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
헤더 <utility>
template< class T >
/* see below */ move_if_noexcept( T& x ) noexcept;
(C++11부터)
(C++14부터 constexpr)

std::move_if_noexcept 이동 생성자가 예외를 던지지 않거나 복사 생성자가 없는 경우(이동 전용 타입) 인수에 대한 rvalue 참조를 얻고, 그렇지 않으면 인수에 대한 lvalue 참조를 얻습니다. 이는 일반적으로 강력한 예외 보장과 이동 의미론을 결합하는 데 사용됩니다.

std::move_if_noexcept의 반환 타입은 다음과 같습니다:

  • T&& 만약 std::is_nothrow_move_constructible<T>::value || !std::is_copy_constructible<T>::value가 true이라면.
  • 그렇지 않으면, const T&.

매개변수

x - 이동 또는 복사될 객체

반환값

std :: move ( x ) 또는 x , 예외 안전성 보장에 따라 선택합니다.

복잡도

상수.

참고 사항

이것은 예를 들어 std::vector::resize 에서 사용되며, 이는 새로운 저장 공간을 할당하고 기존 저장 공간에서 새로운 저장 공간으로 요소들을 이동하거나 복사해야 할 수 있습니다. 이 작업 중 예외가 발생하면, std::vector::resize 는 이 시점까지 수행한 모든 작업을 취소하는데, 이는 std::move_if_noexcept 를 사용하여 이동 생성자와 복사 생성자 중 어느 것을 사용할지 결정한 경우에만 가능합니다 (복사 생성자를 사용할 수 없는 경우에는 이동 생성자가 어쨌든 사용되며 강력한 예외 보장이 적용되지 않을 수 있습니다).

예제

#include <iostream>
#include <utility>
struct Bad
{
    Bad() {}
    Bad(Bad&&) // may throw
    {
        std::cout << "Throwing move constructor called\n";
    }
    Bad(const Bad&) // may throw as well
    {
        std::cout << "Throwing copy constructor called\n";
    }
};
struct Good
{
    Good() {}
    Good(Good&&) noexcept // will NOT throw
    {
        std::cout << "Non-throwing move constructor called\n";
    }
    Good(const Good&) noexcept // will NOT throw
    {
        std::cout << "Non-throwing copy constructor called\n";
    }
};
int main()
{
    Good g;
    Bad b;
    [[maybe_unused]] Good g2 = std::move_if_noexcept(g);
    [[maybe_unused]] Bad b2 = std::move_if_noexcept(b);
}

출력:

Non-throwing move constructor called
Throwing copy constructor called

참고 항목

(C++11)
함수 인자를 전달하며 템플릿 타입 인자를 사용하여 값 범주를 보존함
(function template)
(C++11)
인자를 xvalue로 변환함
(function template)