Обновление: я использую MSVC10, что не дает мне семантики перемещения по умолчанию
Допустим, я хочу создать обычный класс с парой участников, не являющихся членами модуля;
class Foo {
NonPodTypeA a_;
NonPodTypeB b_;
}
Как обычно, я реализую конструктор копирования и оператор присваивания, в котором я использую конструктор копирования:
Foo(const Foo& other) : a_(other.a_), b_(other.b_) {}
Foo& operator=(const Foo& other) {
Foo constructed(other);
*this = std::move(constructed);
return *this;
}
Затем я реализую конструктор перемещения и назначение перемещения, в котором используется std::swap вместо std::move для всех членов, поскольку они могли быть написаны до того, как стала доступна семантика перемещения, поскольку семантика перемещения реализована, я могу опустить реализацию функция-член подкачки:
Foo(Foo&& other) {
::std::swap(a_, other._a);
::std::swap(b_, other._b);
}
Foo& operator=(Foo&& other) {
::std::swap(a_, other._a);
::std::swap(b_, other._b);
return *this;
}
И вот мой вопрос; можно ли здесь сделать что-то более общее, предполагая, что я ничего не знаю об участниках?
Например, конструктор перемещения не совместим с членами, объявленными const, но если я реализую конструктор перемещения как Foo(Foo&& other) : a_(std::move(other.a_)), b_(std::move(other.b_)){}
, я не могу быть уверен, что классы без семантики перемещения не будут скопированы? Могу ли я каким-то умным образом использовать конструктор перемещения в назначении перемещения?
std::swap
. - person ildjarn   schedule 12.03.2012swap
, а не явной квалификации (если только эта квалификация не являетсяboost::swap
, которая будет использовать ADL внутри). - person ildjarn   schedule 12.03.2012std::swap
, вы хотите вызвать пользовательский. - person ildjarn   schedule 12.03.2012namespace std
. Вот почему вы хотите выбратьswap
из пространства имен ADL. - person MSalters   schedule 12.03.2012