c++ - c ++何时/为什么变量被构造/销毁的值捕获
问题描述
我无法理解调用 C(const C&) 和 ~C() 时发生了什么
所以,我制作了一个按值捕获的 lambda,然后返回它。据我了解,每个返回的 lambda 都有自己的上下文(跟踪与该声明一致)。
但是,根据将 lambda 描述为函数对象快捷方式的 stroustrup(在 C++ 第 4 版的 11.4.1 中),我希望仅为捕获的变量制作一份副本,但似乎并非如此。
这是我的代码
//g++ 5.4.0
#include <functional>
#include <iostream>
using namespace std;
class C{
float f;
public:
C(float f): f(f){ cout << "#build C(" << f << ")\n"; }
C(const C& c): f(c.f+0.1){ cout << "#copy C(" << f << ")\n"; }
~C(){ cout << "#destroy C(" << f << ")\n"; }
void display() const { cout << "this is C(" << f << ")\n"; }
};
std::function<void(void)> make_lambda_val(int i){
C c{i};
return [=] () -> void { c.display(); } ;
}
int main(){
cout << "/**trace\n\n";
cout << "--- ?? ---\n";
{
auto l0 = make_lambda_val(0);
auto l1 = make_lambda_val(1);
auto l2 = make_lambda_val(2);
cout << "ready\n";
l0();
l1();
l2();
}
cout << "\n*/\n";
}
和相应的痕迹:(我的评论)
/**trace
--- ?? ---
#build C(0)
#copy C(0.1) <<--| 2 copies ??
#copy C(0.2) <<--|
#destroy C(0.1) <---- one of which is already discarded ?
#destroy C(0)
#build C(1)
#copy C(1.1)
#copy C(1.2)
#destroy C(1.1)
#destroy C(1)
#build C(2)
#copy C(2.1)
#copy C(2.2)
#destroy C(2.1)
#destroy C(2)
ready
this is C(0.2) <---- the second copy is kept ?
this is C(1.2)
this is C(2.2)
#destroy C(2.2)
#destroy C(1.2)
#destroy C(0.2)
*/
解决方案
我希望只为捕获的变量制作一份副本
实际上,捕获的变量被复制一次。也就是说,它只是一次复制操作中的源。
Astd::function
不是 lambda。它的初始化涉及复制可调用对象。因此,当lambda被复制到 中时std::function
,它按值保存的变量也会被复制。当函数返回时,lambda 临时变量被销毁。您看到的是您创建的 lambda 中的变量的破坏。
推荐阅读
- sql - ILE RPG SQLStored Procedure 设置时间戳的选项?
- jpeg - JPEG 霍夫曼“解码”程序
- qt - QThreadStorage vs C++11 thread_local
- java - 从java中的控制台读取具有UTF-8标准的字符
- android - 如何从方形网格视图中删除不需要的(填充)列?
- eclipse-cdt - 应该如何将包含路径提供给 cdt 插件
- php - 如何防止在数组中覆盖?
- c - 为什么这个函数不复制输入文件?
- java - 为什么我找不到对 iText 文档的引用?
- jquery - 用于表单提交的 JQuery 脚本在 Chrome 中运行良好,但在 IE11 中运行良好