Я наткнулся на код, который передает лямбду в качестве аргумента emplace_back, что меня смутило. Поэтому я написал небольшой тест для проверки синтаксиса:
struct A
{
int a;
A(){cout<<"constructed"<<endl;}
A(const A& other){a = other.a; cout<<"copied"<<endl;}
A(const A&& other){a = other.a; cout<<"moved"<<endl;}
};
int main()
{
vector<A> vec;
vec.emplace_back(
[]{A a;
a.a = 1;
return a;
}());
A a2;
a2.a = 2;
vec.emplace_back(std::move(a2));
return 0;
}
У меня есть два вопроса:
1) Может кто-нибудь уточнить, как лямбда может быть передана в качестве аргумента emplace_back? Я видел только те аргументы конструктора, которые передавались в прошлое.
2) Вывод был:
constructed
moved
constructed
moved
copied
Откуда поступает последняя копия? Почему два подхода не эквивалентны.