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.我是一个初学者,所以我可能会错过一些关于auto
lambdas的知识.谢谢.
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)
会像你期望的那样编译和行动.2您可以使用与预期使用lambda相同的方式使用函数指针,因为它们都将充当函子.
1.在C++ 14中,您可以将lambdas声明auto
为参数类型,例如[](auto t){}
.这些是通用的lambda,并且有模板化operator()
.由于函数指针不能表示模板化函数,因此该+
技巧不适用于通用lambdas.
2.从技术上讲,您+
在分配时不需要第二个操作员.lambda将在赋值时转换为函数指针类型.不过我喜欢这种一致性.
归档时间: |
|
查看次数: |
2056 次 |
最近记录: |