#include <iostream>
#include <memory>
#include <functional>
using namespace std;
int main() {
unique_ptr<int> uptr = make_unique<int>(5566);
std::function<void()> func;
// 1. Why compile error...
// func = std::bind([](unique_ptr<int> &&uptr2) {cout << *uptr2 << endl; }, std::move(uptr));
// func();
// 2. Why can I only write auto for deduction?
auto func2 = std::bind([](const unique_ptr<int>& uptr2/*no const is OK but why?*/)
{ cout << *uptr2 << endl; },
std::move(uptr));
// only can use "const &" to invoke func2?
// && or by value will compile error, but "&" can run successfully without reason....
func2();
auto func3 = std::bind([](unique_ptr<int> uptr2) {cout << *uptr2 << endl; }, std::move(uptr));
//func3(); // 3. How to invoke func3?... compile error
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYWluKCkgewoKICB1bmlxdWVfcHRyPGludD4gdXB0ciA9IG1ha2VfdW5pcXVlPGludD4oNTU2Nik7CiAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGZ1bmM7CiAgLy8gMS4gV2h5IGNvbXBpbGUgZXJyb3IuLi4gCiAgLy8gZnVuYyA9IHN0ZDo6YmluZChbXSh1bmlxdWVfcHRyPGludD4gJiZ1cHRyMikge2NvdXQgPDwgKnVwdHIyIDw8IGVuZGw7IH0sIHN0ZDo6bW92ZSh1cHRyKSk7IAogIC8vIGZ1bmMoKTsKICAvLyAyLiBXaHkgY2FuIEkgb25seSB3cml0ZSBhdXRvIGZvciBkZWR1Y3Rpb24/CiAgYXV0byBmdW5jMiA9IHN0ZDo6YmluZChbXShjb25zdCB1bmlxdWVfcHRyPGludD4mIHVwdHIyLypubyBjb25zdCBpcyBPSyBidXQgd2h5PyovKQogICAgICAgICAgICAgICAgICAgICAgICAgICB7CWNvdXQgPDwgKnVwdHIyIDw8IGVuZGw7IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUodXB0cikpOyAKICAvLyBvbmx5IGNhbiB1c2UgImNvbnN0ICYiIHRvIGludm9rZSBmdW5jMj8KICAvLyAmJiBvciBieSB2YWx1ZSB3aWxsIGNvbXBpbGUgZXJyb3IsIGJ1dCAiJiIgY2FuIHJ1biBzdWNjZXNzZnVsbHkgd2l0aG91dCByZWFzb24uLi4uICAgICAgICAgICAgICAgICAgICAgICAgIAogIGZ1bmMyKCk7CiAgYXV0byBmdW5jMyA9IHN0ZDo6YmluZChbXSh1bmlxdWVfcHRyPGludD4gdXB0cjIpIHtjb3V0IDw8ICp1cHRyMiA8PCBlbmRsOyB9LCBzdGQ6Om1vdmUodXB0cikpOwogIC8vZnVuYzMoKTsgLy8gMy4gSG93IHRvIGludm9rZSBmdW5jMz8uLi4gY29tcGlsZSBlcnJvcgoKICByZXR1cm4gMDsKfQ==