Почему, когда нельзя переместить один член, нельзя переместить весь объемлющий класс?

Пример

struct MyObject {
  MyObject(int value):value(value) { }
  MyObject(MyObject const&o):value(o.value) { }

  int value;
};

Предположим, что конструктор копирования делает что-то помимо того, что он полезен. Тогда

std::function<void()> f() {
  MyObject o;
  std::vector<int> v;
  return [=]() { /* use v and o */ &o; &v; }
}

v и o сначала копируются в исходный лямбда-объект, что хорошо. Но затем они снова копируются каждый раз, когда лямбда-объект нужно переместить. Даже если v мог бы быть перемещен, но не перемещается. Это потому, что у лямбды нет неявного конструктора перемещения, потому что o не имеет конструктора перемещения или тривиального конструктора копирования.

Кто-нибудь может объяснить причину этого?

11
задан Johannes Schaub - litb 29 November 2011 в 22:18
поделиться