微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于boost::function &

如何解决关于boost::function &

为什么这两个变量的地址(即hoofuncCtx::hookFunc4Boost 不一样Ctx::getBoostHookFun()返回一个左引用 Ctx::hookFunc4Boost

我打算通过返回对 Ctx::hookFunc4Boost 的左引用来避免复制临时对象。

这是代码片段:

#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <iostream>

class Ctx
{
public:
const boost::function<void((void*))>& getBoostHookFun(void)
{
    std::cout << "inner hookFunc4Boost:" << (void*)(&hookFunc4Boost) << std::endl;
    return hookFunc4Boost;
}

private:
boost::function<void(void*)> hookFunc4Boost;

};

int main()
{
    Ctx ctx;
    Ctx *pCtx = &ctx;
    const boost::function<void((void*))> hookFunc = pCtx->getBoostHookFun();
    std::cout << "outer hookFunc:" << (void*)(&hookFunc) << std::endl;
}

输出如下:

inner hookFunc4Boost:0x7fffffffdf28
outer hookFunc:0x7fffffffd540

解决方法

要避免复制,只需将变量更改为引用:

const auto& hookFunc = pCtx->getBoostHookFun();
,

在 JaMiT 的帮助下,我想我找到了答案。

这是一个演示代码(https://coliru.stacked-crooked.com/view?id=12bc35c31c9eb605):

a=np.array([10,11,12,13,14])
a.index(3)

变量 #include <iostream> class Ctx { public: Ctx(int cnt):m_cnt(cnt){} const int& getCnt(void) { std::cout << "inner:" << (void*)&m_cnt << std::endl; return m_cnt; } private: int m_cnt; }; int main() { Ctx ctx(6); Ctx *pCtx = &ctx; const int cnt = pCtx->getCnt(); std::cout << "outer:" << (void*)&cnt << std::endl; } cnt 是两个不同的变量。所以他们的地址应该是不同的。调用Ctx::m_cnt时仍需调用复制构造函数。我说得对吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。