아니, 아니다. 여기에 귀하의 라인 :
Bs = other.Bs;
복사 지정을하고 있습니다. 이동 생성자 본문에 있으면 표현식 값 유형이 변경되지 않습니다. lvalue는 여전히 lvalues이고 rvalue는 여전히 rvalue입니다.
Bs = std::move(other.Bs);
을하지만 여전히, 모든 경우에 적용 할 수있는 효율적이지 않다 :
가 이동 할당을 수행하기 위해서는 다음과 같을 것이다.
다른 문제가 있습니다. std::vector
생성자에 중괄호를 위탁했기 때문에 코드가 컴파일되지 않습니다. 실제로이 값을 이동해야합니다.
// a kitten dies when your move constructor is not noexcept
A(A&& other) noexcept
// in the move constructor of A, we move construct it's member too.
: Bs{std::move(other.Bs)}
// empty body
{}
모두의 가장 좋은 해결책은 이것이다 :
자네 말이 맞아, 그것은 비어 다음은 예입니다. 생성자를 넣지 않으면 컴파일러가 대신 해줍니다. 다른 생성자를 추가하지만 컴파일러가 자신의 이동 생성자를 추가 할 수 있도록하려면
, 당신은 명시 적으로 기본 수 있습니다
// bonus: noexcept when it can.
A(A&&) = default;
마지막 일을.클래스에 이동 가능하지만 복사 불가능한 다른 클래스가 포함되어있는 경우, 클래스는 가능한 한 할 것입니다 : 복사 생성.
유형 C
은 움직일 수없는 클래스지만 복사 할 수 있다고합시다.
다음은 예입니다 :
// the `C&&` from the move will bind to the `const C&` of the operator=
auto anotherC = std::move(aC);
[this] (http://thbecker.net/articles/rvalue_references/section_05.html)을보십시오. – wally