암시 적 이동 생성자가 멤버 별 이동 및 암시 적 이동 할당 연산자가 멤버 별 할당을 수행한다는 것은 무엇을 의미합니까?
에서 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] 삭제
몇 마디 만하겠습니다