암시 적 이동 생성자 및 할당 연산자

미칼 트 38

암시 적 이동 생성자가 멤버 별 이동 및 암시 적 이동 할당 연산자가 멤버 별 할당을 수행한다는 것은 무엇을 의미합니까?

에서 https://en.cppreference.com/w/cpp/language/move_constructor :

비 유니온 클래스 유형 (클래스 및 구조체)의 경우 이동 생성자 는 xvalue 인수를 사용한 직접 초기화를 사용하여 초기화 순서에 따라 객체의 기본 및 비 정적 멤버의 전체 멤버 별 이동수행합니다 . 이것이 constexpr 생성자의 요구 사항을 충족하는 경우 생성 된 이동 생성자는 constexpr입니다.

에서 https://en.cppreference.com/w/cpp/language/move_assignment :

비 유니온 클래스 유형 (클래스 및 구조체)의 경우 이동 할당 연산자는 멤버 별 스칼라에 대한 기본 제공 할당을 사용하여 선언 순서에 따라 객체의 직접 기본 및 직계 비 정적 멤버에 대한 전체 멤버 별 이동 할당 을 수행합니다. 배열에 대한 이동 할당 및 클래스 유형에 대한 이동 할당 연산자 (비가 상이라고 함).

다음 예제 클래스 템플릿의 경우 암시 적 멤버가 다음과 같이 표시됩니다.

template<class T>
class Holder {
public:
    Holder(int size) : m_size(size) { m_data = new T[m_size]; }

    Holder(Holder && other) :
        m_size(std::move(other.m_size)),
        m_data(std::move(other.m_data))
    {}

    Holder& operator=(Holder && other) {
       if(this == &other) return *this;
       m_data = std::move(other.m_data);
       m_size = std::move(other.m_size);
       return *this;
    }

    ~Holder() { delete [] m_data; }
private:
    T* m_data;
    int m_size;
};

무엇 무엇을 할 것이다, 더 std::move()위의 예는 자원을 전송?

환상적인 미스터 폭스

링크 된 페이지를 더 아래로 보면 클래스 컴파일러가 생성 한 이동 생성자 (및 이동 할당 연산자)가 실제로 Trivial 임을 알 수 있습니다 .

간단한 이동 생성자

다음 사항이 모두 참이면 클래스 T의 이동 생성자는 간단합니다.

  • 사용자가 제공하지 않습니다 (즉, 암시 적으로 정의되거나 기본값이 지정됨).
  • T에는 가상 멤버 함수가 없습니다.
  • T에는 가상 기본 클래스가 없습니다.
  • T의 모든 직접 염기에 대해 선택된 이동 생성자는 사소합니다.
  • T의 모든 비 정적 클래스 유형 (또는 클래스 유형의 배열) 멤버에 대해 선택된 이동 생성자는 사소합니다.

사소한 이동 생성자는 사소한 복사 생성자와 동일한 작업 을 수행하는 생성자입니다. 즉, std :: memmove 에서처럼 객체 표현의 복사본을 만듭니다 . C 언어 (POD 유형)와 호환되는 모든 데이터 유형은 간단하게 이동할 수 있습니다.

(강조 광산)

두 멤버 변수는 POD 유형이므로 간단하게 이동할 수 있습니다. 클래스가 가상이 아니고 중요하지 않은 멤버를 보유하지 않기 때문에 단순하고 모든 데이터 멤버가 복사됩니다. 주석에서 언급했듯이 포인터와 UB가 두 번 삭제됩니다.

이 경우 이동 된 개체 포인터의 소유권을 가져와로 설정하여 이동 의미 체계를 올바르게 구현해야합니다 nullptr. 또는 더 나은 방법은 std::vector또는 std::unique_ptr.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

할당 연산자 오버로딩과 암시 적 생성자 제공

분류에서Dev

생성자 이동 및 할당 이동. 기본 클래스의 연산자

분류에서Dev

생성자 이동 및 클래스에 대한 할당 연산자 이동

분류에서Dev

C # 암시 적 연산자

분류에서Dev

덧셈 연산자 및 동적 벡터 과부하시 분할 오류

분류에서Dev

할당 및 동적으로 생성 된 입력 태그 값을 업데이트 - JQuery와 -Materialize 자동 완성

분류에서Dev

이항 연산자에 대해서만 암시 적 변환 연산자 방지

분류에서Dev

할당 연산자 템플릿 및 C ++의 복사 생성자

분류에서Dev

명시 적 복사 생성자로 컴파일되지 않는 값에 의한 할당 연산자

분류에서Dev

암시 적 contructors 및 생성자 체인에 관한 혼란

분류에서Dev

인스턴스 모킹 및 암시 적 생성자

분류에서Dev

이항 연산자를 사용한 C ++ 암시 적 변환

분류에서Dev

unique_ptr <>로 이동 생성자 및 할당 구현

분류에서Dev

C # 명시 적 연산자 및 개체

분류에서Dev

기본 C ++ 복사 및 이동 생성자 및 할당 연산자를 삭제하는 단점이 있습니까?

분류에서Dev

모호한 오버로드, 암시 적 변환 및 명시 적 생성자

분류에서Dev

모호한 오버로드, 암시 적 변환 및 명시 적 생성자

분류에서Dev

C ++ 생성자 암시 적 변환이 발생하지 않음

분류에서Dev

암시 적 (bool) 및 == 연산자 재정의-if 문을 올바르게 처리

분류에서Dev

C ++ 클래스, 암시 적 캐스팅 및 연산자 오버로딩

분류에서Dev

오른쪽 시프트 및 할당 연산자 논리?

분류에서Dev

이동 생성자 측면에서 복사 할당 연산자 구현

분류에서Dev

이동 생성자 대 이동 할당

분류에서Dev

PHP의 논리적 할당 연산자

분류에서Dev

이항 연산자 '*'는 'SCNVector3'및 'Double'유형의 피연산자에 적용 할 수 없습니다.

분류에서Dev

이상한 오류 "연산자 '*'는 'double'및 'decimal'유형의 피연산자에 적용 할 수 없습니다."

분류에서Dev

이상한 오류 "연산자 '*'는 'double'및 'decimal'유형의 피연산자에 적용 할 수 없습니다."

분류에서Dev

이항 연산자 '|' 'Int'및 'UInt8'유형의 피연산자에는 적용 할 수 없습니다.

분류에서Dev

이항 연산자 '-='는 'CGFloat'및 'Int'유형의 피연산자에 적용 할 수 없습니다.

Related 관련 기사

  1. 1

    할당 연산자 오버로딩과 암시 적 생성자 제공

  2. 2

    생성자 이동 및 할당 이동. 기본 클래스의 연산자

  3. 3

    생성자 이동 및 클래스에 대한 할당 연산자 이동

  4. 4

    C # 암시 적 연산자

  5. 5

    덧셈 연산자 및 동적 벡터 과부하시 분할 오류

  6. 6

    할당 및 동적으로 생성 된 입력 태그 값을 업데이트 - JQuery와 -Materialize 자동 완성

  7. 7

    이항 연산자에 대해서만 암시 적 변환 연산자 방지

  8. 8

    할당 연산자 템플릿 및 C ++의 복사 생성자

  9. 9

    명시 적 복사 생성자로 컴파일되지 않는 값에 의한 할당 연산자

  10. 10

    암시 적 contructors 및 생성자 체인에 관한 혼란

  11. 11

    인스턴스 모킹 및 암시 적 생성자

  12. 12

    이항 연산자를 사용한 C ++ 암시 적 변환

  13. 13

    unique_ptr <>로 이동 생성자 및 할당 구현

  14. 14

    C # 명시 적 연산자 및 개체

  15. 15

    기본 C ++ 복사 및 이동 생성자 및 할당 연산자를 삭제하는 단점이 있습니까?

  16. 16

    모호한 오버로드, 암시 적 변환 및 명시 적 생성자

  17. 17

    모호한 오버로드, 암시 적 변환 및 명시 적 생성자

  18. 18

    C ++ 생성자 암시 적 변환이 발생하지 않음

  19. 19

    암시 적 (bool) 및 == 연산자 재정의-if 문을 올바르게 처리

  20. 20

    C ++ 클래스, 암시 적 캐스팅 및 연산자 오버로딩

  21. 21

    오른쪽 시프트 및 할당 연산자 논리?

  22. 22

    이동 생성자 측면에서 복사 할당 연산자 구현

  23. 23

    이동 생성자 대 이동 할당

  24. 24

    PHP의 논리적 할당 연산자

  25. 25

    이항 연산자 '*'는 'SCNVector3'및 'Double'유형의 피연산자에 적용 할 수 없습니다.

  26. 26

    이상한 오류 "연산자 '*'는 'double'및 'decimal'유형의 피연산자에 적용 할 수 없습니다."

  27. 27

    이상한 오류 "연산자 '*'는 'double'및 'decimal'유형의 피연산자에 적용 할 수 없습니다."

  28. 28

    이항 연산자 '|' 'Int'및 'UInt8'유형의 피연산자에는 적용 할 수 없습니다.

  29. 29

    이항 연산자 '-='는 'CGFloat'및 'Int'유형의 피연산자에 적용 할 수 없습니다.

뜨겁다태그

보관