传递lambda作为void*参数至std::pair时构造不匹配错误排查
问题分析与解决
核心错误点
- 类型不匹配:你传递给
std::pair的第二个参数是lambda表达式,但函数call要求的pair第二个元素类型是void*&。lambda是匿名自定义类型,和void*没有隐式转换关系,编译器找不到匹配的std::pair构造函数。 - 引用参数的初始化问题:就算类型匹配,
std::pair<std::uintptr_t, void*&>的第二个元素是非const左值引用,无法用临时对象(比如lambda转成的临时函数指针)来初始化,这也会导致构造失败。
修正方案(根据实际需求选择)
需求1:传递无捕获lambda作为函数指针
无捕获lambda可以隐式转换为对应签名的函数指针,因此需要调整call函数的pair类型:
#include <cstdint> #include <utility> // 修改pair的第二个元素为函数指针类型 void call(std::pair<std::uintptr_t, void*(*)(void*)> addresses) { const auto [p1, func_ptr] = addresses; // 调用函数指针示例 void* result = func_ptr(nullptr); } int main() { void* start = nullptr; call({ reinterpret_cast<std::uintptr_t>(start), [] (void* main_app) -> void* { // 这里写你的逻辑 return main_app; } }); }
如果需要支持有捕获的lambda,建议改用std::function:
#include <cstdint> #include <utility> #include <functional> void call(std::pair<std::uintptr_t, std::function<void*(void*)>> addresses) { const auto [p1, func] = addresses; void* result = func(nullptr); } int main() { void* start = nullptr; int some_data = 42; call({ reinterpret_cast<std::uintptr_t>(start), [some_data] (void* main_app) -> void* { // 可以访问捕获的变量 return main_app; } }); }
需求2:传递普通void*指针
如果你的本意是传递一个void*类型的指针而非lambda,只需确保第二个参数是合法的void*左值:
#include <cstdint> #include <utility> void call(std::pair<std::uintptr_t, void*&> addresses) { const auto [p1, p2] = addresses; } int main() { void* start = nullptr; void* some_ptr = nullptr; // 定义一个左值指针 call({ reinterpret_cast<std::uintptr_t>(start), some_ptr }); }
内容的提问来源于stack exchange,提问作者infamous hvher
相关产品推荐
相关产品推荐

