Сообщение Re[4]: move argument от 16.11.2015 16:01
Изменено 16.11.2015 16:16 _niko_
Здравствуйте, Igore, Вы писали:
На самом деле у Вас тоже не совсем корректно )
Вот теперь переменная m только перемещается!
На самом деле у Вас тоже не совсем корректно )
#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, Вы писали:
На самом деле у Вас тоже не совсем корректно )
Вот теперь переменная m только перемещается!
На самом деле у Вас тоже не совсем корректно )
#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 только перемещается!