我有一个函数,它使用move-capture构造一个lambda函数(仅限C ++ 1y)并返回它。
#include <iostream>
#include <functional>
#include <memory>
using namespace std;
function<int ()> makeLambda(unique_ptr<int> ptr) {
return [ ptr( move(ptr) ) ] () {
return *ptr;
};
}
int main() {
// Works
{
unique_ptr<int> ptr( new int(10) );
auto function1 = [ ptr(move(ptr)) ] {
return *ptr;
};
}
// Does not work
{
unique_ptr<int> ptr( new int(10) );
auto function2 = makeLambda( std::move(ptr) );
}
return 0;
}
然而,似乎在返回时,调用了unique_ptr<int>
的复制构造函数。为什么这个/我怎么能绕过这个?
答案 0 :(得分:7)
问题是std::function<int ()>
返回类型,它试图制作lambda的副本。这将失败,因为由于存在std::unique_ptr
而隐式删除了复制构造函数。不是将lambda存储在std::function
对象中,而是使用返回类型推导,现在将移动lambda。
auto makeLambda(unique_ptr<int> ptr) {
return [ ptr( move(ptr) ) ] () {
return *ptr;
};
}
您还应该将makeLambda
的参数类型更改为unique_ptr<int>&&