2014-12-21 3 views
5

Я хотел бы знать, когда конструктор перемещения вызывается в коде C++.Когда конструктор перемещения вызван

Это значит, что я знаю, что когда я вызываю Foo a(b), это конструктор копирования, так что я должен кодировать для вызова move constructor.

+0

Ответы на [это SO нить] (http://stackoverflow.com/questions/3106110/what-is-move-semantics) поможет , – wakjah

ответ

4

Конструктор перемещения - это еще один конструктор. Если у вас есть перегруженные конструкторы, как и любые другие функции, перегруженные, выбор того, какой конструктор называется, сводится к правилам разрешения перегрузки. То есть, когда вы строите объект с 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));.

+1

В вашем примере Foo a (b), 'b' - именованный объект, и поэтому он не может быть rvalue. 'std :: move (b)' потребуется здесь. –

+0

@MichaelGazonda Я рассматриваю 'b' как общее выражение, а не только выражение' b'. Я сделаю это яснее. –

3

В общем, мы должны сказать это, указав опорный аргумент 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++ (Б. Страуструп)

Смежные вопросы