相关疑难解决方法(0)

在lambda中移动捕获

如何通过C++ 11 lambda中的move(也称为右值引用)捕获?

我想写这样的东西:

std::unique_ptr<int> myPointer(new int);

std::function<void(void)> example = [std::move(myPointer)]{
   *myPointer = 4;
};
Run Code Online (Sandbox Code Playgroud)

c++ lambda rvalue-reference c++11

135
推荐指数
4
解决办法
6万
查看次数

如何将unique_ptr捕获到lambda表达式中?

我尝试过以下方法:

std::function<void ()> getAction(std::unique_ptr<MyClass> &&psomething){
    //The caller given ownership of psomething
    return [psomething](){ 
        psomething->do_some_thing();
        //psomething is expected to be released after this point
    };
}
Run Code Online (Sandbox Code Playgroud)

但它没有编译.有任何想法吗?

更新:

AS建议,需要一些新的语法来明确指定我们需要将所有权转移到lambda,我现在考虑以下语法:

std::function<void ()> getAction(std::unique_ptr<MyClass> psomething){
    //The caller given ownership of psomething
    return [auto psomething=move(psomething)](){ 
        psomething->do_some_thing();
        //psomething is expected to be released after this point
    };
}
Run Code Online (Sandbox Code Playgroud)

它会是一个好的候选人吗?

更新1:

我将展示我的实施movecopy如下:

template<typename T>
T copy(const T &t) {
    return t;
}

//process lvalue references
template<typename T>
T move(T &t) {
    return …
Run Code Online (Sandbox Code Playgroud)

c++ lambda unique-ptr c++11

38
推荐指数
4
解决办法
3万
查看次数

安全地异步使用C++ 11 lambdas

我从Objective-C背景来到C++ 11,而我正在努力解决的一件事是C++ 11 lambdas与Objective-C"blocks"的不同捕获语义.(见这里进行比较).

在Objective-C中,与C++一样,如果引用成员变量,则会隐式捕获self/ this指针.但是因为Objective-C中的所有对象都是有效的"共享指针",所以要使用C++术语,你可以这样做:

doSomethingAsynchronously(^{
  someMember_ = 42;
});
Run Code Online (Sandbox Code Playgroud)

...并确保在执行块时,您正在访问其成员的对象将处于活动状态.你不必考虑它.C++中的等价物似乎是这样的:

// I'm assuming here that `this` derives from std::enable_shared_from_this and 
// is already owned by some shared_ptr.
auto strongThis = shared_from_this();

doSomethingAsynchronously([strongThis, this] {
  someMember_ = 42;   // safe, as the lambda holds a reference to this
                      // via shared_ptr.
});
Run Code Online (Sandbox Code Playgroud)

在这里,您需要记住除了this指针之外还要捕获shared_ptr.是否有一些不那么容易出错的方法来实现这一目标?

c++ lambda shared-ptr c++11

16
推荐指数
2
解决办法
4197
查看次数

标签 统计

c++ ×3

c++11 ×3

lambda ×3

rvalue-reference ×1

shared-ptr ×1

unique-ptr ×1