【发布时间】:2013-07-19 12:58:16
【问题描述】:
我最近在我刚刚编写的一些代码中遇到了一个非常愚蠢的错误。在花了一些时间查看调试器之后,我发现了一些我觉得很奇怪的东西。考虑以下不正确但微不足道的代码。
#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)) 其中id 可能非常大。它从未引发任何内存异常,但我想它花费了大量时间来分配它(没有失败),这就是它出现循环的原因。因此,似乎 MSVC 很乐意将隐式转换为 std::list,但 gcc 却不是。这很令人困惑,根据http://www.cplusplus.com/reference/list/list/list/,std::list 的构造函数都标记为explicit。看起来错误是 MSVC10,MSVC11 拒绝此代码(应该如此)。
【问题讨论】:
-
@LuchianGrigore 我在compileonline.com/compile_cpp_online.php 尝试过,它编译得很好,但执行没有完成。
-
奇怪,你用的是什么 gcc 版本?我收到一个错误:
error: no matching function for call to 'map<int, list<int> >::insert(pair<int, int>)' -
@user1520427:也许那个网站上的编译没有完成......
标签: c++ visual-c++ stl