присваивание и перемещение себя
От: _NN_ www.nemerleweb.com
Дата: 09.04.19 22:05
Оценка: 2 (1)
Есть известный паттерн проверки присваивания и перемещения объекта себе:
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

А что делаете сегодня вы ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Отредактировано 10.04.2019 13:42 _NN_ . Предыдущая версия .
Re: Самоприсваивание и самоперемещение
От: Vamp Россия  
Дата: 09.04.19 22:25
Оценка:
_NN>А что делаете сегодня вы ?

Мы отдаем тривиальные присваивания на совесть компилятора (приведенный пример это просто плохой код), а нетривиальные так просто не решаются.
Да здравствует мыло душистое и веревка пушистая.
Re: Самоприсваивание и самоперемещение
От: _niko_ Россия  
Дата: 10.04.19 09:05
Оценка:
_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
    {
        // ...
    }
};
Re: Самоприсваивание и самоперемещение
От: Videoman Россия https://hts.tv/
Дата: 10.04.19 10:09
Оценка:
Здравствуйте, _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;
}
Отредактировано 10.04.2019 10:09 Videoman . Предыдущая версия .
Re[2]: Самоприсваивание и самоперемещение
От: _NN_ www.nemerleweb.com
Дата: 10.04.19 13:39
Оценка:
Здравствуйте, _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)
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.