【发布时间】:2019-07-02 07:22:11
【问题描述】:
我正在观看 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
这说明返回值使用了拷贝构造函数,而返回值被定义为一个const引用,并创建了一个新复制的对象返回到这个const引用。
但如果 lambda 定义为:
const auto &refc = [&]()->const auto&{
cout << "lambda returns..." << EOL;
return c; }();
没有调用复制ctor,结果是:
Def ctor
address: 0x7fff319dc2af
lambda returns...
address: 0x7fff319dc2af
Dtor
我认为文案没有必要,设计背后有充分的理由吗?我想知道在什么情况下复制捕获的变量有用?
【问题讨论】:
-
我的错误,已编辑,对混乱感到抱歉
-
Lambda 返回的行为就像声明为
auto。 -
如果要引用返回可以返回
auto&