Информация об изменениях

Сообщение Re[4]: move argument от 16.11.2015 16:01

Изменено 16.11.2015 16:16 _niko_

Здравствуйте, Igore, Вы писали:

На самом деле у Вас тоже не совсем корректно )

#include <utility>

struct movable
{
};
struct notMovable
{
};

class one
{
public:
    one(movable&& m,notMovable nm)
        // Хоть переменная m и попала сюда через перемещение здесь она уже имеет имя/адрес т.е. она как бы lvalue
        // поэтому для последующего перемещения её используем std::forward
        : _m(std::forward<movable>(m)), _nm(nm)
    {}

    movable    _m;
    notMovable _nm;
};

class creator
{
public:
    template<typename S, typename ... Args>
    static S* create(Args&& ... args) // Здесь необходимо указать семантику перемещения, иначе все в функцию попадает через конструктор копирования
    {
        return new one(std::forward<Args>(args)...);
    }
};

int main(int , char** )
{
    movable m;
    notMovable nm;
    creator::create<one>(std::move(m),nm); // В параметрах шаблона не нужно указывать перемещение, т.к. переменная m находится на стеке (lvalue) её перемещаем явно
    return 0;
}


Вот теперь переменная m только перемещается!
Re[4]: move argument
Здравствуйте, Igore, Вы писали:

На самом деле у Вас тоже не совсем корректно )

#include <utility>

struct movable
{
    movable() = default;
    movable(movable&&) = default;
    movable& operator=(movable&&) = default;
 
    movable(const movable&) = delete;
    movable& operator=(const movable&) = delete;
};
struct notMovable
{
    notMovable() = default;
    notMovable(const notMovable&) = default;
    notMovable& operator=(const notMovable&) = default;
 
    notMovable(notMovable&&) = delete;
    notMovable& operator=(notMovable&&) = delete;
};

class one
{
public:
    one(movable&& m,notMovable nm)
        // Хоть переменная m и попала сюда через перемещение здесь она уже имеет имя/адрес т.е. она как бы lvalue
        // поэтому для последующего перемещения её используем std::forward
        : _m(std::forward<movable>(m)), _nm(nm)
    {}

    movable    _m;
    notMovable _nm;
};

class creator
{
public:
    template<typename S, typename ... Args>
    static S* create(Args&& ... args) // Здесь необходимо указать семантику перемещения, иначе все в функцию попадает через конструктор копирования
    {
        return new one(std::forward<Args>(args)...);
    }
};

int main(int , char** )
{
    movable m;
    notMovable nm;
    creator::create<one>(std::move(m),nm); // В параметрах шаблона не нужно указывать перемещение, т.к. переменная m находится на стеке (lvalue) её перемещаем явно
    return 0;
}


Вот теперь переменная m только перемещается!