2016-10-05 3 views
1
class Foo { int a; int b; int c; std::wstring d; std::vector<char*> e }; 

에 대한 이동 생성자 (~ 512 바이트) 및 ~ 512 바이트 std::vector과는 다음과 같이 사용 사례입니다 :C++ - 큰 문자열 가정 클래스 포함하는 문자열

void Test() 
{ 
    Foo foo; 
    DoSomething(std::move(foo)); // DoSomething will stuff it in a long-lived queue 
} 

는 기본적으로 내가 RAII 년대를 원하는 개체의 수명이 변경됩니다.

이동 생성자와 할당 연산자를 구현하면됩니까? 또는 std::move(..)을 수행하는 것만으로 충분합니까?

+0

벡터가 실제로 문자열을 보유하고 있지 않습니다. 대부분의 경우 문자열에 대한 포인터입니다. 'Foo'/vector를 복사하면 어떤 경우에도 문자열을 복사하지 않습니다. – user4407569

+0

포인터로 게임을 시작하자마자 [3 ~ 5 규칙] (http://en.cppreference.com/w/cpp/language/rule_of_three)이 적용된다고 가정하십시오 – user4581301

답변

4

std::move은 이동 생성자 및/또는 이동 할당 연산자 없이는 쓸모가 없습니다.

그러나 클래스의 모든 멤버는 이동 가능하며 사용자 정의 소멸자, 복사 생성자 또는 복사 할당 연산자가 없으므로 올바른 작업을 수행하는 암시 적으로 정의 된 이동 생성자와 이동 할당 연산자가 있습니다.

이 특정한 경우에 대한 대답은 이동 생성자 또는 할당 연산자를 정의 할 필요가 없다는 것입니다.