C++ 11将`auto` Lambda更改为其他Lambda?

Arc*_*man 22 c++ lambda auto c++11

假设我有以下包含lambda的变量:

auto a = [] { return true; };
Run Code Online (Sandbox Code Playgroud)

我想稍后a回来false.我可以按照这个方针做点什么吗?

a = [] { return false; };
Run Code Online (Sandbox Code Playgroud)

此语法给出了以下错误:

binary '=' : no operator found which takes a right-hand operand of type 
'main::<lambda_a7185966f92d197a64e4878ceff8af4a>' (or there is no acceptable conversion)

IntelliSense: no operator "=" matches these operands
        operand types are: lambda []bool ()->bool = lambda []bool ()->bool
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这样的事情?我想将auto变量更改为不同的lambda.我是一个初学者,所以我可能会错过一些关于autolambdas的知识.谢谢.

Rya*_*ing 33

每个lambda表达式都会创建一个新的唯一类型,因此第一个lambda的类型与第二个lambda的类型不同(示例).此外,lambda的复制赋值运算符被定义为已删除(示例),因此您无法做到这一点.对于类似的效果,你可以a成为一个std::function对象虽然它会花费你一些性能

std::function<bool()> a = [] { return true; };
a = [] { return false; };
Run Code Online (Sandbox Code Playgroud)


jag*_*ire 33

可以使用一元运算+符将Lambda转换为函数指针,如下所示:

+[]{return true;}
Run Code Online (Sandbox Code Playgroud)

只要捕获组为空且没有auto参数.1

如果这样做,只要lambda都具有相同的签名,就可以将不同的lambdas分配给同一个变量.

在你的情况下,

auto a = +[]{return true;};
a = +[]{return false;};
Run Code Online (Sandbox Code Playgroud)

Coliru的实例

会像你期望的那样编译和行动.2您可以使用与预期使用lambda相同的方式使用函数指针,因为它们都将充当函子.


1.在C++ 14中,您可以将lambdas声明auto为参数类型,例如[](auto t){}.这些是通用的lambda,并且有模板化operator().由于函数指针不能表示模板化函数,因此该+技巧不适用于通用lambdas.

2.从技术上讲,您+在分配时不需要第二个操作员.lambda将在赋值时转换为函数指针类型.不过我喜欢这种一致性.

  • C++正式进入Perl领域的那一刻! (11认同)