При компиляции с GCC 4.7.2 или 4.8.1 и запустить следующую программуконструктор копирования называется для захваченной переменной вместо перемещения конструктора
#include <stdio.h>
#include <functional>
class A
{
public:
A()
{
}
A(const A& a)
{
printf("Copy ctor\n");
}
A(A&& a)
{
printf("Move ctor\n");
}
};
int main()
{
A a;
auto func = [a] {
};
auto newfunc = std::move(func);
return 0;
}
даст выход:
Copy ctor
Move ctor
, который кажется быть совершенно нормальным.
Однако, когда A a;
изменяется на const A a;
, выход заключается в следующем:
Copy ctor
Copy ctor
Почему движение лямбда зависит от того, было ли исходная переменная была сопзЬ или нет?
FWIW, MSVC2012 всегда делает две копии.
Устойчивость не может быть отброшена автоматически. Добавляя его, захватывающая лямбда должна хранить его как const, и вы не можете перемещаться из const. –
@ FrançoisMoisan это близко, но не совсем правильно, как вы можете видеть из моего примера, вы можете перегрузить конструктор перемещения с помощью 'const A &&' – aaronman
@aaronman. Вы правы, конечно. Я почему-то подумал, что подпись запросила неконстантные ссылки rvalue-specfically. –