Rule A6-2-1 (required, implementation, automated)

Move and copy assignment operators shall either move or respectively copy base classes and data members of a class, without any side effects.

Rationale

It is expected behavior that the move/copy assigned operator are only used to move/copy the object of the class type and possibly set moved-from object to a valid state. Those operators are not supposed to provide any performance overhead or side effects that could affect moving or copying the object. Note: Class members that are not essential for a class invariant may not need to be moved/copied (e.g. caches, debug information).

Example

// $Id: A6-2-1.cpp 305786 2018-01-30 08:58:33Z michal.szczepankiewicz $

#include <cstdint>
#include <utility>
class A
{
public:
A& operator=(const A& oth) // Compliant
{
if(&oth == this)
{
return *this;

}
x = oth.x;

return *this;

}

private:
std::int32_t x;
};
class B
{
public:
~B() { delete ptr; }

//compliant
B& operator=(B&& oth)
{

if(&oth == this)
{

return *this;

}
ptr = std::move(oth.ptr);
// Compliant - this is not a side-effect, in this
// case it is essential to leave moved-from object
// in a valid state, otherwise double deletion will
// occur.

return *this;

}

private:
std::int32_t* ptr;

};

class C
{
public:
C& operator=(const C& oth)
{
if(&oth == this)
{
return *this;

}
x = oth.x % 2; // Non-compliant - unrelated side-effect

return *this;

}

private:
std::int32_t x;
};

class D
{
public:
explicit D(std::uint32_t a) : a(a), noOfModifications(0) {}

D& operator=(const D& oth)
{
if(&oth == this)
{
return *this;

}
a = oth.a;
//compliant, not copying the debug information about number of modifications

return *this;

}

void SetA(std::uint32_t aa)

{
++noOfModifications;
a = aa;
}
std::uint32_t GetA() const noexcept
{
return a;
}

private:
std::uint32_t a;
std::uint64_t noOfModifications;
};

See also

JSF December 2005 [8]: AV Rule 83: An assignment operator shall assign all data members and bases that affect the class invariant (a data element representing a cache, for example, would not need to be copied).