//example: -std=c++20
std::string(*l)() { [](){ return "s";} }; //does not work
std::string s {"mm"}; //works
std::string fs(){
return "bb"; //works
}
我确信有一些解释,只是不确定是哪一个:)
std::string(*l)() { [](){ return "s";} };
这不是字符串声明。这是一个函数指针声明。
您可以通过两种方式修复它:
std::string l = [](){ return "s";}(); //Notice the Immediately Invoked Initializing Lambda.
//I am "calling" the lambda immediately after it is declared.
using MakeString = std::string(*l)();
template<typename Callable>
std::string F(Callable&& C) {
return C();
}
MakeString f = [](){ return "s"; };
std::string s = F(f);
但是请注意,如果 lambda 需要在捕获列表中包含任何内容(方括号必须为空),则它们不能衰减为函数指针。模板版本将适用于任何可调用的内容,只需直接传入 lambda,而不是通过
MakeString
将其转换为函数指针(如果是这种情况)。