【发布时间】:2012-07-12 17:07:10
【问题描述】:
我有一个向量对的映射,如下所示:
std::map<std::pair<uint16, uint16>, std::vector<std::vector<uint32> > >
地图在类的构造函数中填充。该类提供了一个公共方法,该方法返回指向std::vector<std::vector<uint32> >(映射值部分)的指针,如下所示:
typedef std::pair<uint16, uint16> key;
typedef std::vector<std::vector<uint32> > value;
value* FindValues(key someKey) {
std::map<key, value>::const_iterator it;
it = someStore.find(someKey);
if (it != someStore.end())
return &(value)it->second;
return NULL;
}
这就是它变得奇怪的时候。当迭代 FindValues 返回的向量时,所有子向量都有一个大的负数(例如 -1818161232)作为它们的第一个值。但如果我使用如下函数:
value FindValues(key someKey) {
std::map<key, value>::const_iterator it;
return someStore.find(someKey)->second;
}
...那么数值是正常的。这只发生在 all 子向量的索引 0 处的值。但是,使用第二种方法时,如果找不到密钥(原因很明显),我的应用程序会出现段错误。我做错了什么?
【问题讨论】:
-
为什么在取地址之前要把
it->second转换成value? -
@Kliest,我也想问同样的问题。从逻辑上讲,这不应该是一个问题,但我总是警惕
C风格的演员表在出现微妙和不明显的问题时出现。 -
强制转换的结果不是右值吗?
-
gcc 4.6.1 编译时会发出警告。
-
@Kleist:他这样做是因为他使用
const_iterator进行搜索。出于这个原因,return &it->second根本无法编译。所以,他决定用那个演员“覆盖”这个错误。