【发布时间】:2017-10-27 09:09:57
【问题描述】:
我正在尝试在 std::unique_ptr 上 std::bind 和 std::move。生成的函数对象似乎是不可变的,因此在调用函子时不可能执行移动。
我怀疑这是因为 lambda 在默认情况下是不可变的,原因相同 - 每次调用它们都应该做同样的事情。但是在某些情况下它们需要是可变的,这就是我们使用 mutable 关键字的原因。
void foo(std::unique_ptr<int>&& ptr)
{
cout << *ptr << endl;
}
int main()
{
std::unique_ptr<int> ptr = std::make_unique<int>(123);
std::bind(foo, std::move(ptr))(); // Doesn't compile
[&ptr]() { foo(std::move(ptr)); }(); // Equivalent, doesn't compile
[&ptr]() mutable { foo(std::move(ptr)); }(); // Compiles
return 0;
}
不使用bind,我可以将函数调用包装在可变 lambda 中。但至少对我个人而言,bind 在这种情况下看起来更干净、更简单。
我知道调用可变 lambda 两次会导致未定义的行为,因为我会再次从一个已经移动的指针移动。但就我而言,我知道函子只会被调用一次。
有没有办法可以使用std::bind 来做到这一点?有bind_mutable 之类的吗?如果没有,我应该如何自己写?
【问题讨论】:
-
您的声明是错误的,两个 lambda 都有效:Demo。绑定需要的是
rvalue_refence_wrapper。见is-there-a-reference-wrapper-for-rvalue-references。
标签: c++ c++11 lambda immutability