c++ - 是否可以检测 lambda 在捕获组中是否有“this”?
问题描述
在 c++17 中,是否可以通过模板元编程来检测“this”是否是捕获组的一部分?还是在运行时?
我有一个 A 类,它接受 lambda 以供以后调用。但是,如果拥有 A 的对象 B 在它提供给 A 的 lambda 中捕获“this”,那么它可能会导致微妙的 use-after free。能够在这种情况下崩溃将是有价值的。
我知道他们不会是 100%(例如,用户可以将其捕获为“a = this”或“b = (void*)this”)。我也不希望能够捕获所有问题(例如,如果我捕获对成员变量的引用)。我只是想在明显错误的情况下增加一些信心
解决方案
lambda只不过是编译器生成的具有重载的类operator()
。模板编程中没有机制可以(跨平台)检测编译器是否生成了特定类型,更不用说内省该类的“成员”以弄清楚它捕获了什么以及如何捕获。
您只需要期望您的系统的用户执行适当的纪律。
推荐阅读
- xpath - Scrapy/XPath:替换段落内的内联标签
- javascript - 闪亮的 CSS 微调器
- ionic2 - 离子中“构造函数”函数的括号内应该包含什么?
- r - 使用 Windows 调度程序运行 R 脚本
- reactjs - 我应该如何使用 CalmmJS 和 React 在组件 MouseClick 上触发 XHR?
- javascript - 使用javascript重写输入值添加“#”
- git - 是否有自动更新源文件中元数据的工具?
- python - Numba 签名协议
- angular - 如何使用 Angular 显示从我的 api 调用中获得的 Observable 数据?
- python-3.x - 在 numpy 文件中存储和提取数组的问题