返回对boost :: any持有的数据的引用

时间:2011-03-16 14:58:42

标签: c++ boost reference

我有一个名为gmap的任何指针的地图,定义如下:

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

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

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

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

Boost's documentation of any_cast

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

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

1 个答案:

答案 0 :(得分:4)

这很奇怪,但我明白了。

忽略它说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>

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