Вы берете каждый из них по значению, например так:
struct foo
{
foo(std::string s, bar b, qux q) :
mS(std::move(s)),
mB(std::move(b)),
mQ(std::move(q))
{}
std::string mS;
bar mB;
qux mQ;
};
Инициализация параметров функции аргументом будет либо конструктором копирования, либо конструктором перемещения.Оттуда вы просто перемещаете значения параметров функции в переменные-члены.
Помните: семантика копирования и перемещения - это служба, предоставляемая классом, а не вами .В C ++ 0x вам больше не нужно беспокоиться о том, как получить собственную «копию» данных;просто спросите об этом и позвольте классу сделать это:
foo f("temporary string is never copied", bar(), quz()); // no copies, only moves
foo ff(f.mS, f.mB, f.mQ); // copies needed, will copy
foo fff("another temp", f.mB, f.mQ); // move string, copy others
Примечание: ваш конструктор принимает только значения, эти значения сами поймут, как создать себя.Оттуда, конечно, вам нужно переместить их туда, куда вы хотите.
Это применимо везде.Есть функция, которая нуждается в копии?Сделайте это в списке параметров:
void mutates_copy(std::string s)
{
s[0] = 'A'; // modify copy
}
mutates_copy("no copies, only moves!");
std::string myValue = "don't modify me";
mutates_copy(myValue); // makes copy as needed
mutates_copy(std::move(myValue)); // move it, i'm done with it
В C ++ 03 вы могли бы эмулировать его довольно хорошо, но это не было обычным (по моему опыту):
struct foo
{
foo(std::string s, bar b, qux q)
// have to pay for default construction
{
using std::swap; // swaps should be cheap in any sane program
swap(s, mS); // this is effectively what
swap(b, mB); // move-constructors do now,
swap(q, mQ); // so a reasonable emulation
}
std::string mS;
bar mB;
qux mQ;
};