如果没有,g++将不会编译此代码-fpermssive
。clang 和 icc 都没有抱怨。这段代码合法吗?
我的意图是声明wrapped_foo
并在单独的编译单元中定义它。那可能吗?
错误1.cpp
\n\nauto wrap(int (*f)(int)){\n return [f](int i) {\n return f(i);\n };\n}\n\nint foo(int);\nextern decltype(wrap(foo)) wrapped_foo;\n\nint func(){\n return wrapped_foo(2);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n\n花园 -m gcc/7.3.0-01c7/bin g++ -Wall -Wextra bug1.cpp -c\nbug1.cpp:8:28: 错误: \xe2\x80\x98wrap(int (*)(int)) ::<lambda(int)>wrapped_foo\xe2\x80\x99,使用本地类型 \xe2\x80\x98wrap(int (*)(int))::<lambda(int)>\xe2\x80\x99 声明,已使用但从未定义 [-fpermissive]\n extern decltype(wrap(foo))wrapped_foo;\n ^~~~~~~~~~~\n\n
您将无法wrapped_foo
在任何其他编译单元中进行定义,因为每个 lambda 类型都是唯一的。因此,即使此代码在技术上是有效的,它也永远不会成功链接。G++ 只是走得更远,也拒绝编译它。
这里还有一个更简单的代码来重现该问题:
auto l = [](){};
extern decltype(l) wrapped_foo;
void func(){
wrapped_foo();
}
Run Code Online (Sandbox Code Playgroud)