Есть известный паттерн проверки присваивания и перемещения объекта себе:
operator=(A const& a) { if (this == &a) return *this; ...
operator=(A&& a) { if (this == &a) return *this; ...
Рекомендации от CppCoreGuidelines советуют не проверять, однако код при этом должен работать как ожидается
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c62-make-copy-assignment-safe-for-self-assignment
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c64-a-move-operation-should-move-and-leave-its-source-in-a-valid-state
А что делаете сегодня вы ?
_NN>А что делаете сегодня вы ?
Для не тривиального объекта:
class data_t
{
public:
data_t(data_t&&) noexcept
{
// ...
}
data_t(const data_t&)
{
// ...
}
data_t& operator=(data_t&& other)
{
data_t(std::move(other)).swap(*this);
return *this;
}
data_t& operator=(const data_t& other)
{
data_t(other).swap(*this);
return *this;
}
public:
void swap(data_t& other) noexcept
{
// ...
}
};
Здравствуйте, _NN_, Вы писали:
Общий шаблон такой:
class MyClass
{
public:
MyClass(const MyClass& that);
MyClass(MyClass&& that) noexcept;
~MyClass() noexcept;
void swap(MyClass& that) noexcept;
MyClass& operator=(MyClass that) noexcept;
private:
OtherClass m_mem;
// ...
};
MyClass::MyClass(const MyClass& that)
: m_mem(that.m_mem)
// ...
{
}
MyClass::MyClass(MyClass&& that) noexcept
: m_mem(std::move(that.m_mem))
// ...
{
}
MyClass::~MyClass() noexcept
{
// ...
}
void MyClass::swap(MyClass& that) noexcept
{
using std::swap;
swap(m_mem, that.m_mem);
// ...
}
MyClass& MyClass::operator=(MyClass that) noexcept
{
swap(that);
return *this;
}
Здравствуйте, _niko_, Вы писали:
_NN>>А что делаете сегодня вы ?
__>Для не тривиального объекта:
__>...
__> data_t& operator=(const data_t& other)
__> {
...
__>
А почему не принимать просто по значению ?
https://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom/3279550#3279550
data_t& operator=(data_t other)