看起来我不能将无捕获的lambda作为模板参数传递给由函数指针函数模板化.我做错了吗,还是不可能?
#include <iostream> // Function templated by function pointer template< void(*F)(int) > void fun( int i ) { F(i); } void f1( int i ) { std::cout << i << std::endl; } int main() { void(*f2)( int ) = []( int i ) { std::cout << i << std::endl; }; fun<f1>( 42 ); // THIS WORKS f2( 42 ); // THIS WORKS fun<f2>( 42 ); // THIS DOES NOT WORK (COMPILE-TIME ERROR) !!! return 0; }
解决方法
这在语言的定义中主要是一个问题,以下是更明显的:
using F2 = void(*)( int ); // this works: constexpr F2 f2 = f1; // this does not: constexpr F2 f2 = []( int i ) { std::cout << i << std::endl; };
这基本上意味着你的希望/期望是相当合理的,但语言当前没有这样定义 – 一个lambda不会产生一个适合作为constexpr的函数指针.