You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:01:01