【发布时间】:2018-04-27 16:55:07
【问题描述】:
我遇到了将 lambda 作为参数传递给 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) 有人可以澄清如何将 lambda 作为参数传递给 emplace_back 吗?过去我只看到构造函数参数被传递给 emplace 。 2)输出是:
constructed
moved
constructed
moved
copied
最后一个副本来自哪里?为什么这两种方法不等价。
【问题讨论】:
-
这是被放置的 lambda 的结果。注意 lambda 末尾的
}());中额外的()。立即计算 lambda。 -
是的,但这是否意味着我可以调用emplace_back中的任何函数,只要返回可以传递给构造函数?
-
是的。评估参数时,如果表达式是函数调用,则将使用该函数的结果。这就是所有功能的工作方式,而不仅仅是
emplace_back。请务必了解emplace_back永远不会看到该功能。它只会看到结果。 -
考虑阅读good c++ book