this question的回答引起了我的注意,我认为通过引用返回的lambda正在复制。如果我们定义这个例子:
struct A {
A() = default;
A(const A&) { cout << "copy\n"; }
};
此代码均未调用复制构造函数:
A a;
const A* pa = &a;
const A& ra = *pa;
但是这段代码在返回时调用了复制构造函数:
[](const A* pa){ return *pa; }(pa);
我不明白。为什么要通过副本返回?或者更一般地说我想我应该问:“lambda如何决定如何返回?”
答案 0 :(得分:2)
lambda的返回类型是auto
([expr.prim.lambda]/4
),因此除非您使用尾随返回类型明确指定它,否则将创建一个副本:
[](const A* pa) -> const auto& { return *pa; }(pa);