为什么 lambda 不会将字符串文字返回到 std::string 中?

问题描述 投票:0回答:1
//example: -std=c++20

std::string(*l)() { [](){ return "s";} }; //does not work

std::string s {"mm"}; //works

std::string fs(){
    return "bb"; //works
}

我确信有一些解释,只是不确定是哪一个:)

c++ lambda stdstring
1个回答
0
投票
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
将其转换为函数指针(如果是这种情况)。

© www.soinside.com 2019 - 2024. All rights reserved.