У меня есть следующий пример:
#include <iostream>
#include <functional>
struct Tmr {
typedef std::function<void(void)> Callback;
Callback cb;
Tmr(Callback cb_) :
cb( cb_ )
{
}
void timeout()
{
cb();
}
};
struct Obj {
struct Tmr t;
Obj() :
t( std::ref( *this ) )
{
}
void operator () ()
{
std::cout << __func__ << '\n';
}
};
int main(int argc, char *argv[])
{
Obj o;
o.t.timeout();
return 0;
}
Это работает отлично, но изначально у меня был конструктор Obj
как:
Obj() :
t( *this )
Это приводит к ошибке выполнения. Я предполагаю, что это связано с тем, что в моем обратном вызове хранится только ссылка на функцию-член, а не на объект для вызова элемента.
Я не понимаю, что делает std::ref
, когда я делаю Obj() : t(std::ref(*this))
и почему это заставляет программу работать. Может ли кто-нибудь пролить свет на то, что происходит и как оно работает?