Я хотел бы знать, когда конструктор перемещения вызывается в коде C++.Когда конструктор перемещения вызван
Это значит, что я знаю, что когда я вызываю Foo a(b)
, это конструктор копирования, так что я должен кодировать для вызова move constructor.
Я хотел бы знать, когда конструктор перемещения вызывается в коде C++.Когда конструктор перемещения вызван
Это значит, что я знаю, что когда я вызываю Foo a(b)
, это конструктор копирования, так что я должен кодировать для вызова move constructor.
Конструктор перемещения - это еще один конструктор. Если у вас есть перегруженные конструкторы, как и любые другие функции, перегруженные, выбор того, какой конструктор называется, сводится к правилам разрешения перегрузки. То есть, когда вы строите объект с Foo a(<some-expression>);
, может быть несколько возможных конструкторов, и нужно выбрать.
Конструктор копирования принимает один аргумент типа const Foo&
. Этот ссылочный тип lvalue будет привязан к любому выражению, обозначающему объект Foo
. Конструктор перемещения принимает один аргумент типа Foo&&
. Эта ссылка rvalue будет привязана только к изменяемым значениям r. Фактически, эта перегрузка будет предпочтительнее в случае прохождения модифицируемого значения r.
Это означает, что в Foo a(<some-expression>);
, если выражение <some-expression>
является изменяемым значением rvalue, будет выбран конструктор перемещения. В противном случае выбирается конструктор копирования. Модифицируемые значения r обычно появляются при обозначении временных объектов (например, объект, возвращаемый функцией). Также можно принудительно выставить выражение в выражение rvalue, используя std::move
, например Foo a(std::move(b));
.
В вашем примере Foo a (b), 'b' - именованный объект, и поэтому он не может быть rvalue. 'std :: move (b)' потребуется здесь. –
@MichaelGazonda Я рассматриваю 'b' как общее выражение, а не только выражение' b'. Я сделаю это яснее. –
В общем, мы должны сказать это, указав опорный аргумент rvalue
. Например:
template<class T>
void swap(T& a, T& b)
{
T tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
}
move()
стандартная библиотека функция, возвращающая ссылку RValue в качестве аргумента move(x)
означает «дать мне ссылку RValue на х». То есть std::move(x)
ничего не двигает, вместо этого он позволяет пользователю перемещать x.
Источник: Язык программирования C++ (Б. Страуструп)
Ответы на [это SO нить] (http://stackoverflow.com/questions/3106110/what-is-move-semantics) поможет , – wakjah