我正在从Lambda返回参考,为什么复制会发生?

时间:2017-01-06 12:31:36

标签: c++ lambda reference return return-type

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);

Live Example

我不明白。为什么要通过副本返回?或者更一般地说我想我应该问:“lambda如何决定如何返回?”

1 个答案:

答案 0 :(得分:2)

lambda的返回类型是auto[expr.prim.lambda]/4),因此除非您使用尾随返回类型明确指定它,否则将创建一个副本:

[](const A* pa) -> const auto& { return *pa; }(pa);