gpt4 book ai didi

C++ 为什么编译器无法生成返回 Lambda 中捕获变量的常量引用的代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:45 27 4
gpt4 key购买 nike

我正在观看 Jason Turner 关于 IIFE 的演讲。有一个例子看起来像下面的代码:

#include <iostream>
#define EOL '\n'
using std::cout;

class C
{
public:
C(){ std::cout << "Def ctor\n"; }
C(const C &c){ std::cout << "Copy ctor\n" << EOL; }
C(C&& c){ std::cout << "Move ctor\n" << EOL; }
~C(){ std::cout << "Dtor\n"; }

void Print() const { cout << "address: " << this << EOL; }
};
int main()
{
C c;
c.Print();
const auto &refc = [&](){
cout << "lambda returns..." << EOL;
return c; }();
refc.Print();
return 0;
}

输出是:

Def ctor
address: 0x7ffe6a6765bf
lambda returns...
Copy ctor
address: 0x7ffe6a6765be
Dtor
Dtor

这表明返回值使用复制构造函数,而返回值被定义为常量引用并创建一个新复制的对象返回到常量引用。

但是如果 lambda 定义为:

const auto &refc = [&]()->const auto&{ 
cout << "lambda returns..." << EOL;
return c; }();

没有调用复制构造函数,结果是:

Def ctor
address: 0x7fff319dc2af
lambda returns...
address: 0x7fff319dc2af
Dtor

我认为文案没有必要,设计背后有充分的理由吗?我想知道在什么情况下复制捕获的变量有用?

最佳答案

关于 lambda 的文档如果未指定尾随返回类型,则告诉我们 lambda 的返回类型是什么:

Omitted trailing-return-type: the return type of the closure's operator() is deduced from return statements as if for a function whose return type is declared auto.

所以它导致复制构造函数被调用。

如果你想避免这种情况,你可以使用 auto&const auto& 作为尾随返回类型。

关于C++ 为什么编译器无法生成返回 Lambda 中捕获变量的常量引用的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54585828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com