我正在对一段代码进行一些更改,并且在以下情况下对理解 std::move 的行为有疑问:
struct Timer {
Timer (boost::asio::io_service& ios) : timer_{ios} {}
boost::asio::steady_timer timer_;
};
struct TimerContext {
void *ctxt_;
};
class A {
std::function<void(Timer *, const TimerContext&)> callback_;
boost::asio::io_service ios_;
};
A的构造函数:
A::A (std::function<void(Timer *, const TimerContext&)> cb) : callback_{std::move(cb)}
{
}
回调函数定义:
void
customCallback (Timer *timer, const TimerContext& ctxt) {
...
}
在main()
,
for (int i = 0; i < 5; ++i) {
A *a = new A{customCallback};
}
我的疑问是这一行:
A::A (std::function<void(Timer *, const TimerContext&)> cb) : callback_{std::move(cb)}
A 类在循环中被实例化,并且相同 customCallback
的函数被移动到每个新对象的自定义构造函数中。
第一个 std::move 不会使回调函数无法用于下一次调用吗?据我了解,如果您使用std::move(t)
, 则t
不能在该范围内再次使用。
我很困惑std::move(cb)
在new A
. 这是执行它的正确方法吗?