Обновление: я использую 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;
}
Затем я реализую конструктор move и move-присваивание, которое использует std :: swap вместо std :: move для всех членов, как они могли бы быть написаны до того, как была доступна семантика перемещения, так как семантика перемещения реализована, я могу опустить реализацию функции-члена подкачки:*
А вот и мой вопрос; Можно ли здесь что-то сделать более общим, предполагая, что я ничего не знаю о членах?
Например, конструктор перемещения не совместим с объявленными членами const, но если я реализуюконструктор перемещения как Foo(Foo&& other) : a_(std::move(other.a_)), b_(std::move(other.b_)){}
Не могу быть уверен, что классы без семантики перемещения не копируются?Могу ли я каким-то умным образом использовать конструктор перемещения в задании перемещения?