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

如何修改含auto返回的std::function代码以兼容C++11编译?

问题描述

我正尝试让一个C14库在我们的C11代码库中运行,在使用std::function时遇到了问题(我对它了解甚少)。

极简代码如下:

#include <functional>
#include <iostream>

class A
{
public:
    A() {}
    ~A() {}
    
    using CallbackFn = std::function<int(int, double)>;
    auto GetCallbackFn() const { return mCallbackFcn.target<int (*)(int, double)>(); }

private:
   CallbackFn mCallbackFcn;

};

int main()
{
    std::cout << "hi there\n";
}

该代码在C14下编译无错误,但在C11下会报错:

main.cpp:20:5: error: ‘GetCallbackFn’ function uses ‘auto’ type specifier without trailing return type

我尝试将auto替换为CallbackFn及其他组合,但均出现不同错误。请问如何修改代码使其能在C++11下编译?

解决方法

C++11不支持不带尾置返回类型的auto自动推导函数返回值,你需要明确写出GetCallbackFn的返回类型。

std::function::target<T>()的返回类型是T*,这里你指定的模板参数是int (*)(int, double)(指向int(int, double)类型函数的指针),所以返回类型是int (*)(int, double)*——也就是指向函数指针的指针。

推荐用类型别名简化写法,提升可读性:

#include <functional>
#include <iostream>

class A
{
public:
    A() {}
    ~A() {}
    
    using CallbackFn = std::function<int(int, double)>;
    // 定义函数指针类型的别名
    using FuncPtr = int (*)(int, double);
    // 明确返回类型:指向FuncPtr的指针
    FuncPtr* GetCallbackFn() const {
        return mCallbackFcn.target<FuncPtr>();
    }

private:
   CallbackFn mCallbackFcn;

};

int main()
{
    std::cout << "hi there\n";
}

如果不想用类型别名,也可以直接写出完整返回类型(可读性较差):

#include <functional>
#include <iostream>

class A
{
public:
    A() {}
    ~A() {}
    
    using CallbackFn = std::function<int(int, double)>;
    // 直接写出返回类型:指向函数指针的指针
    int (*(*GetCallbackFn()) (int, double)) const { 
        return mCallbackFcn.target<int (*)(int, double)>(); 
    }

private:
   CallbackFn mCallbackFcn;

};

int main()
{
    std::cout << "hi there\n";
}

内容的提问来源于stack exchange,提问作者Danny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:12:25