c++ - lambda 捕获的新位置

标签 c++ c++11 lambda

我有一个关于 C++ lambda 的有趣问题。用例是一个性能关键线程,它构造一个具有非空闭包的 lambda,然后将其传递给另一个线程,以便可以“处理”它。

总体思路可行,但我的 lambda 闭包对象被额外复制了一次,并且编译器(当前为 g++ 5.4.0)无法优化掉此拷贝,包括复制省略。我也尝试过类似的结果。

理想情况下,我希望在直接在持久内存中创建 lambda 对象时使用 new 放置,而不是首先在堆栈上创建对象,例如:

auto l = new (buf) [a,b,c](){}

错误是这样的:

lambda_ctor.cpp:39:19: error: expected type-specifier before '[' token
    auto al = (buf) new [a,b,c](){};

我在想也许如果我手头有一个类型而不是实际的 lambda 表达式编译器应该接受它但是尝试提升闭包类型而不评估它会遇到另一个问题:

using T = decltype([a,b,c](){});

出现此错误:

lambda_ctor.cpp:41:24: error: lambda-expression in unevaluated context
    using T = decltype([a,b,c](){});

我似乎找不到解决这个问题的方法,有很多关于如何防止 lambda 在作用域退出时解体的想法,但每个解决方案似乎都涉及在创建闭包对象后复制/移动它(又名额外拷贝)。这有点奇怪,因为通常我们可以完全控制如何创建和传递用户定义的仿函数,并且类似的规则应该适用于闭包。

最佳答案

auto 是你的 friend 。

auto l = new (buf) auto([a,b,c](){});

闭包对象的任何拷贝都应该是可省略的。

关于c++ - lambda 捕获的新位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38127290/

相关文章:

c++ - 双链表中的智能指针

date - c++11时钟/时间点之间的隐式转换

regex - 在 Julia 的过滤器中使用正则表达式

Android/Kotlin : Why is the lambda syntax different for . setOnClickListener() 和 .observe()?

c# - 将函数分配给表达式,反之亦然

c++ - 复制内存块

c++ - 如何允许通配符模板参数

c++ - cpp Linux套接字编程错误与接受

c++ - 当前对象的访问类

c++ - localtime_s 和 strftime 用法构建 ISO 时间字符串