c++ - 使用本地类型声明的 g++ lambda ... 已使用但从未定义 - 真的是错误吗?
问题描述
g++ 不会在没有-fpermssive
. clang 和 icc 都没有抱怨。这段代码合法吗?
我的意图是在一个编译单元中声明wrapped_foo
并在一个单独的编译单元中定义它。那可能吗?
错误1.cpp
auto wrap(int (*f)(int)){
return [f](int i) {
return f(i);
};
}
int foo(int);
extern decltype(wrap(foo)) wrapped_foo;
int func(){
return wrapped_foo(2);
}
花园与 -m gcc/7.3.0-01c7/bin g++ -Wall -Wextra bug1.cpp -c bug1.cpp:8:28: 错误:'wrap(int (*)(int))::<lambda(int)> Wrapped_foo',使用本地类型'wrap(int (*)(int))::< lambda(int)>', 被使用但从未定义 [-fpermissive] extern decltype(wrap(foo)) Wrapped_foo; ^~~~~~~~~~~
解决方案
对的,这是可能的:
头文件
inline auto wrap(int (*f)(int))
{
return [f](int i) {
return f(i);
};
}
int foo(int i);
extern decltype(wrap(&foo)) wrapped_foo;
.cpp 文件
int foo(int i) { return i;}
decltype(wrap(foo)) wrapped_foo = wrap(&foo);
用法
int func(){
return wrapped_foo(42);
}
int main() {
std::cout << func() << std::endl;
}
推荐阅读
- java - 如何从相邻文本中获取文本颜色
- java - 如果使用 InputStream 来自 PIPE 的输入结束,如何使(Java)程序自动结束
- java - 如何对 char 进行 bean 验证?
- c - vscode中的c代码没有出现问题
- python - Numpy int64() 函数参数?
- php - 权限被拒绝麻烦 Laravel,在 centos 7
- python - 如何删除具有所有零值但不具有非零值的零的行
- xamarin - 任务被取消 Xamarin 异常
- html - $@Html.DisplayFor( 在桌子上给了我一个数字,我想使用那个数字,以便 IF 给我那个值
- python - 将输入分解为列出的频率