我最近在我刚刚编写的一些代码中遇到了一个非常愚蠢的错误。在花了一些时间查看调试器之后,我发现了一些我觉得很奇怪的东西。考虑以下不正确但微不足道的代码。
#include <map>
#include <list>
int main() {
std::map<int, std::list<int> > myMap;
// infinite loop, should be std::pair<int, std::list<int> >
myMap.insert(std::pair<int, int>(4, 500000));
return 0;
}
如注释所示,该insert
语句导致程序进入无限循环。造成这种情况的原因很明显,我传入了一个std::pair<int, int>
对象而不是std::pair<int, std::list<int>>
. 不幸的是,这段代码在 gcc 和 MSVC10 中编译得非常好。我希望编译器拒绝此代码,因为类型显然不匹配,但事实并非如此。有人愿意解释为什么吗?
编辑:它似乎在 gcc 中运行良好(我使用的站点无法正常运行),但 MSVC10 仍然接受它。
再次编辑:我相信崩溃是由于在我的原始代码中,插入插入如下:
myMap.insert(std::pair<int, int>(4, id))
whereid
可能非常大。它从未引发任何内存异常,但我想它花费了大量时间来分配它(没有失败),这就是它出现循环的原因。因此,似乎 MSVC 很乐意将隐式转换为std::list
,但 gcc 不是。这很令人困惑,根据http://www.cplusplus.com/reference/list/list/list/的构造函数std::list
都标记为explicit
. 看起来错误是 MSVC10,MSVC11 拒绝此代码(应该如此)。