小编And*_*ejO的帖子

如何测试平易复制可分配的lambdas

我很感激,如果有人能给我一个关于如何测试仿函数的简单复制能力的暗示(lambda用于表示).正如在这个问题中所解释的那样,实现定义了lambda是否可以轻易复制.例如,对于本问题末尾显示的代码,gcc(5.4)和msvc(2015)都会触发断言,这些断言不是简单的可复制的.

我希望通过struct保持this指针和每个捕获值(如果有的话)的副本来表示这些类型的lambda .所以它们看起来都是可以轻易复制的 - 至少对于捕获的值是可以轻易复制的情况.

我驱动这个问题的真实用例是我正在使用一个回调(简化版本std::function不分配并且用于非常简单的仿函数),它保留了一个固定的缓冲区,在其中复制构造(就地)传递了仿函数.然后我希望能够复制/分配这些回调,但为了使其工作(开箱即用),这些固定缓冲区的简单mem复制应该等同于保存在其中的仿函数的复制/分配.

所以我有两个问题:

  1. 想象一下,在test_functor()下面我做new位置,例如

    new (&buffer) F(functor)

    memcopy这个缓冲区对于下面显示的lambda 是否安全?我希望这应该是这样的,因为对于所有情况,只this捕获指针或捕获的值是可以轻易复制的,但如果有人可以证实这一点会很好.

  2. 如何测试保存仿函数的内存的简单复制是否等同于仿函数的复制?如果第一个问题的答案是肯定的,那么就std::is_trivially_copy_assignable不是正确的答案.

#include <type_traits>

template <typename F>
void test_functor(const F& functor)
{
    static_assert(std::is_trivially_destructible<F>::value,
                  "Functor not trivially destructible");
    static_assert(std::is_trivially_copy_constructible<F>::value,
                  "Functor not trivially copy constructible");
    static_assert(std::is_trivially_copy_assignable<F>::value,
                  "Functor not trivially copy assignable");
}

struct A
{
    void test() { test_functor([this]() { }); }
};

struct B
{
    void test() { test_functor([this](int v) { value …
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11

15
推荐指数
1
解决办法
258
查看次数

标签 统计

c++ ×1

c++11 ×1

lambda ×1