【问题标题】:Returning a reference to data held by boost::any返回对 boost::any 持有的数据的引用
【发布时间】:2011-03-16 14:58:42
【问题描述】:

我有一个任何指针的映射,称为 gmap,定义如下:

std::map<std::string, boost::any*>& gmap = getSingleton().globalValues;

这张地图确实是对 globalValues 的引用,我在 gdb 中检查了地址。 我还控制了任何指针(这就是为什么它们是指针,我宁愿做引用,但我现在正在调试)。 现在,然后我用我声明 gmap 的相同方法返回它:

return boost::any_cast<T&>(*gmap[key]);

在 &boost::any_cast[T&][*gmap[key]] 观察内存,一旦我弹出堆栈帧,数据就会变坏。这很奇怪,因为根据:

Boost's documentation of any_cast

返回: 如果传递了一个指针,如果成功则返回一个类似限定的指向值内容的指针,否则返回 null。如果 T 是 ValueType,则返回保存值的副本,否则,如果 T 是对(可能是 const 限定的)ValueType 的引用,则返回对保存值的引用。

因此,据我了解,这不应该返回对局部变量的引用。

【问题讨论】:

    标签: c++ boost reference


    【解决方案1】:

    这很奇怪,但我想通了。

    忽略它说如果 T 是一个引用的事实,它会返回一个;我给它传递了一个指针并得到了正确的指针。但无论出于何种原因,我不能只是取消引用返回值并返回。首先,我必须将该指针存储在显式本地(而不是隐式)中,取消引用并返回。

    return *boost::any_cast<T>(&gmap[key]);
    

    导致不正确的行为

    T* ret = boost::any_cast<T>(&gmap[key]);
    return *ret;
    

    导致正确的行为。

    不知道为什么,因为 AFAIK 仅在底部示例中明确声明了本地。 此外,gmap 现在是:

    map<std::string, boost::any>
    

    因为我现在不需要拥有任何对象。

    【讨论】:

    • 实际上,隐式本地也有效,我只是忘记了我有/没有修改的内容。
    猜你喜欢
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    相关资源
    最近更新 更多