У меня есть класс A
, который выводит сообщение при создании/копировании/перемещении
class A
{
public:
A(std::string s)
:s_(s)
{
std::cout << "A constructed\n";
}
~A()
{
std::cout << "A destructed\n";
}
A(const A& a)
:s_(a.s_)
{
std::cout << "A copy constructed\n";
}
A(A&& a)
:s_(std::move(a.s_))
{
std::cout << "A moved\n";
}
A& operator=(const A& a)
{
s_ = a.s_;
std::cout << "A copy assigned\n";
}
A& operator=(A&& a)
{
s_ = std::move(a.s_);
std::cout << "A move assigned\n";
}
std::string s_;
};
В main
, я создаю экземпляр A
, фиксирую его в лямбда по значению, скопируйте этот лямбда в std::function
и, наконец, переместите, который std::function
в другой std::function
int main()
{
A a("hello ");
std::function<void()> f = [a]{ std::cout << a.s_; };
std::function<void()> g(std::move(f));
}
Отпечатано следующее
A constructed
A copy constructed
A copy constructed
A destructed
A destructed
A destructed
Почему конструктор перемещения A
не вызывается? Не должен ли последний шаг перемещения f
в g
вызвать A
move constructor?