std::vector
를 사용하여 이동 생성자와 소멸자가 throw하지 않는다는 것을 C ++ (특히 ) 에 알려야 합니다 noexcept
. 그런 다음 벡터가 커지면 이동 생성자가 호출됩니다.
다음에 의해 존중되는 이동 생성자를 선언하고 구현하는 방법입니다 std::vector
.
A(A && rhs) noexcept {
std::cout << "i am the move constr" <<std::endl;
... some code doing the move ...
m_value=std::move(rhs.m_value) ;
}
생성자가 아닌 경우 noexcept
, std::vector
다음 표준이 요구하는 예외 보증을 보장 할 수 없기 때문에, 그것을 사용할 수 없습니다.
표준에서 말한 내용에 대한 자세한 내용은 C ++ Move 의미 체계 및 예외 를 참조하세요.
예외와 관련이있을 수 있다고 암시 한 Bo에게 감사합니다. 또한 Kerrek SB의 조언을 고려하고 emplace_back
가능하면 사용 하십시오. 그것은 수 있습니다 빠른 (하지만 종종 아니다), 그것은 명확하고 컴팩트 수 있습니다,하지만 (특히 비 명시 적으로 생성자와) 몇 가지 함정도 있습니다.
편집 , 종종 기본값은 원하는 것입니다. 이동할 수있는 모든 항목을 이동하고 나머지는 복사합니다. 명시 적으로 요청하려면 다음을 작성하십시오.
A(A && rhs) = default;
그렇게하면 가능한 경우 noexcept가 발생합니다. 기본 Move 생성자가 noexcept로 정의되어 있습니까?
이전 버전의 Visual Studio 2015 및 이전 버전에서는 이동 의미 체계를 지원하더라도이를 지원하지 않았습니다.