Tôi đã thử các cách sau:Làm thế nào để chụp một unique_ptr thành một biểu thức 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
};
}
Nhưng nó không biên dịch. Bất kỳ ý tưởng?
UPDATE:
AS đề nghị, một số cú pháp mới là cần thiết để xác định một cách rõ ràng chúng ta cần phải chuyển quyền sở hữu cho lambda, bây giờ tôi đang suy nghĩ về cú pháp sau:
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
};
}
Nó sẽ là một ứng cử viên tốt?
UPDATE 1:
tôi sẽ giới thiệu thực hiện của tôi move
và copy
như sau:
template<typename T>
T copy(const T &t) {
return t;
}
//process lvalue references
template<typename T>
T move(T &t) {
return std::move(t);
}
class A{/*...*/};
void test(A &&a);
int main(int, char **){
A a;
test(copy(a)); //OK, copied
test(move(a)); //OK, moved
test(A()); //OK, temporary object
test(copy(A())); //OK, copying temporary object
//You can disable this behavior by letting copy accepts T &
//test(move(A())); You should never move a temporary object
//It is not good to have a rvalue version of move.
//test(a); forbidden, you have to say weather you want to copy or move
//from a lvalue reference.
}
Đó là giải pháp lý tưởng. –
Khi nào con trỏ duy nhất được phát hành trong những trường hợp này? Khi lambda làm gì? – Leo
@Leo Con trỏ duy nhất phải được di chuyển đến khối dữ liệu của lambda (một lambda chỉ là một đối tượng với toán tử '()') và sau đó được giải phóng sau khi đối tượng lambda được phát hành. Đối tượng lambda như là một rvalue có thể được giải phóng sau 'go.run' nếu nó không được di chuyển. Nếu nó được di chuyển nó có thể được phát hành bất cứ lúc nào sau nó, và điều này có ý nghĩa nếu bạn muốn lên lịch 'do_something_with' để chạy sau này. –