首页 > 解决方案 > 是否可以检测 lambda 在捕获组中是否有“this”?

问题描述

在 c++17 中,是否可以通过模板元编程来检测“this”是否是捕获组的一部分?还是在运行时?

我有一个 A 类,它接受 lambda 以供以后调用。但是,如果拥有 A 的对象 B 在它提供给 A 的 lambda 中捕获“this”,那么它可能会导致微妙的 use-after free。能够在这种情况下崩溃将是有价值的。

我知道他们不会是 100%(例如,用户可以将其捕获为“a = this”或“b = (void*)this”)。我也不希望能够捕获所有问题(例如,如果我捕获对成员变量的引用)。我只是想在明显错误的情况下增加一些信心

标签: c++c++17template-meta-programming

解决方案


lambda只不过是编译器生成的具有重载的类operator()。模板编程中没有机制可以(跨平台)检测编译器是否生成了特定类型,更不用说内省该类的“成员”以弄清楚它捕获了什么以及如何捕获。

您只需要期望您的系统的用户执行适当的纪律。


推荐阅读