Пример
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
не имеет конструктора перемещения или тривиального конструктора копирования.
Кто-нибудь может объяснить причину этого?