Próbuję skompilować następujący kod:Dlaczego konstruktor ruchu nie jest wywoływany podczas poruszania się w lambda?
#include <utility>
struct C2 {
C2() = default;
C2(C2 const&) = delete;
C2(C2&&) = default;
};
int main() {
C2 p2;
([p2_1{ std::move(p2) }]() {
auto p2_2 = std::move(p2_1); // <---
})();
return 0;
}
Jednak to nie skompilować i daje błąd, że przypisanie do p2_2
dzwoni usuniętą funkcję, a mianowicie konstruktor kopiujący. Zauważ, że przejście na p2_1
jest w porządku. Dlaczego nie korzysta się z konstruktora ruchu?
Nie jestem ekspertem od lambda, ale zamiast przenosić 'p2' na' p2_1', przechwytuję 'p2_1', a następnie przenoszę' p2_1' do 'p2_2', czemu nie wystarczy [uchwycić' p2' przez odwołanie i przenieść bezpośrednio do 'p2_2'] (http://ideone.com/PsBQMJ)? '[& p2]() {auto p2_2 = std :: move (p2); } ' –
@RemyLebeau to znacznie uproszczona wersja tego, co faktycznie robiłem. Ciągle usuwałam części, dopóki nie dostałam małej próbki, która nadal ma problem. Rzeczywisty kod potrzebował lambda do przeżycia zakresu funkcji, w którym został zadeklarowany, więc wychwytywanie-po-ref nie wchodziło w grę. – baruch
OK, to ma sens. –