我正在审查一位初级同事的代码并遇到以下代码。
void ActionGetId(boost::property_tree::ptree& callInfo);
void ActionPutId(boost::property_tree::ptree& callInfo);
void handler(int type, std::string data)
{
boost::property_tree::ptree callInfo(data);
if(type == 0)
{
_ioService.post(boost::bind(&ActionGetId, callInfo);
}
else
{
_ioService.post(boost::bind(&ActionPutId, callInfo);
}
}
它们通过引用传递一个局部变量,然后退出该函数。最后调用这些函数时,可能不存在局部变量。然而,这个程序不会崩溃。这是怎么回事?
答案 0 :(得分:8)
boost::bind
复制您提供的参数,并将副本存储在它返回的函数对象中。调用函数时,它不会对局部变量(不再存在)的引用,而是对副本的引用(仍然有效)。
如果您确实希望boost::bind
或std::bind
使用对变量的引用(此处不需要),则需要将变量传递给bind
boost::ref(var)
或std::ref(var)
。