【问题标题】:I'm Returning a Reference From a Lambda, why is a Copy Happening? [duplicate]我从 Lambda 返回引用,为什么会发生复制? [复制]
【发布时间】:2017-05-21 05:20:24
【问题描述】:

this question 的回答引起了我的注意,我认为通过引用返回的 lambdas 正在复制。例如,如果我们这样定义:

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 如何决定如何返回?”

【问题讨论】:

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


【解决方案1】:

lambda 的返回类型是 auto ([expr.prim.lambda]/4),因此除非您使用尾随返回类型明确指定它,否则将进行复制:

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

【讨论】:

猜你喜欢
  • 2012-10-23
  • 2017-02-09
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2020-06-20
  • 2017-05-25
  • 1970-01-01
相关资源
最近更新 更多