如何在C++中创建匿名函数数组并解决编译兼容问题?
C++匿名函数指针数组初始化问题解答
1. 初始化匿名函数指针数组的正确方式
无捕获的lambda表达式可以隐式转换为对应签名的函数指针,符合C++11及以上标准的编译器都支持以下两种写法:
写法一:隐式转换
直接用无捕获lambda初始化函数指针数组,代码本身符合标准:
#include <iostream> using namespace std; static int (*const Func[])(int, int) = { [](int x, int y) -> int { return x + y; }, [](int x, int y) -> int { return x - y; }, [](int x, int y) -> int { return x * y; }, [](int x, int y) -> int { return x / y; } }; int main(void) { cout << Func[1](4, 6) << endl; }
写法二:显式转换(兼容严格编译场景)
如果编译器对隐式转换支持有限,可通过static_cast显式将lambda转换为目标函数指针类型:
#include <iostream> using namespace std; static int (*const Func[])(int, int) = { static_cast<int(*)(int, int)>([](int x, int y) -> int { return x + y; }), static_cast<int(*)(int, int)>([](int x, int y) -> int { return x - y; }), static_cast<int(*)(int, int)>([](int x, int y) -> int { return x * y; }), static_cast<int(*)(int, int)>([](int x, int y) -> int { return x / y; }) }; int main(void) { cout << Func[1](4, 6) << endl; }
2. 配置当前Apple Clang编译器兼容代码
你的Apple Clang 12.0.0本身支持C11及以上标准,但默认编译可能采用了旧版C标准(如C98),导致lambda语法不被识别。只需在编译命令中指定C标准版本即可:
将原编译命令:
g++ /Users/user/Lambda.cpp
修改为以下任一命令:
- 指定C++11标准:
g++ -std=c++11 /Users/user/Lambda.cpp - 指定更高版本标准(推荐,兼容性更好):
g++ -std=c++17 /Users/user/Lambda.cpp
内容的提问来源于stack exchange,提问作者CPlus
相关产品推荐
相关产品推荐

