Development Tip

기본 Move 생성자가 noexcept로 정의되어 있습니까?

yourdevel 2020. 11. 28. 12:33
반응형

기본 Move 생성자가 noexcept로 정의되어 있습니까?


벡터는 재 할당 할 때 요소를 이동하거나 복사할지 여부를 결정하기 전에 이동 생성자가 noexcept로 레이블이 지정되었는지 확인하는 것 같습니다. 기본 이동 생성자가 noexcept로 정의되어 있습니까? 다음 문서를 보았지만 이것을 지정하지 않았습니다. http://en.cppreference.com/w/cpp/language/move_constructor

암시 적으로 선언 된 이동 생성자

클래스 유형 (구조, 클래스 또는 공용체)에 대해 사용자 정의 이동 생성자가 제공되지 않고 다음이 모두 참인 경우 : 사용자 선언 복사 생성자가 없습니다. 사용자 선언 복사 할당 연산자가 없습니다. 사용자 선언 이동 할당 연산자 사용자 선언 소멸자가 없습니다. 암시 적으로 선언 된 이동 생성자가 다음 섹션에 설명 된 조건으로 인해 삭제 된 것으로 정의되지 않은 경우 컴파일러는 이동 생성자를 클래스의 인라인 공용 멤버로 선언합니다. 서명 T :: T (T &&) 클래스는 T :: T (const T &&) 및 T :: T (T &&)와 같이 여러 이동 생성자를 가질 수 있습니다. 일부 사용자 정의 이동 생성자가있는 경우 사용자는 여전히 키워드 default를 사용하여 암시 적으로 선언 된 이동 생성자를 강제로 생성 할 수 있습니다.


대답은 15.4 / 14 (예외 사양)라고 생각합니다.

상속 생성자 (12.9)와 암시 적으로 선언 된 특수 멤버 함수 (Clause 12)에는 예외 사양이 있습니다. 경우 f상속 생성자 또는 암시 적으로 선언 기본 생성자입니다 생성자, 복사 이동 생성자 , 소멸자, 복사 대입 연산자, 또는 이동 할당 연산자, 암시 적 예외 사양 지정 유형-ID T의 경우와 경우에만 T의해 허용되는 예외 사양f 의 암시 적 정의에 의해 직접 호출 된 함수의 f직접 호출하는 함수가 모든 예외를 허용하고 예외 사양f 이있는 경우 모든 예외를 허용합니다. noexcept(true) 직접 호출하는 모든 함수는 예외를 허용하지 않습니다.

기본적으로 그것은 당신이 생각하는 것을 수행하며 암시 적으로 선언 된 이동 생성자는 noexcept가능할 때마다 있습니다.

참고 URL : https://stackoverflow.com/questions/18653726/is-the-default-move-constructor-defined-as-noexcept

반응형