mingw和msvc之间的这种差异正常吗?
Is such difference between mingw and msvc normal
今天我们在工作中发现了一个bug,可以简化为:
std::map<int, Obj*> workMap;
for(auto a : workMap)
{
workMap.erase(a.first);
}
实际上,我们调用了函数,调用了擦除函数,但这不是重点。
关键是,在我的计算机上与visual studio编译器,我有列表迭代器是不可递增的错误,而我的同事与mingw没有任何错误!我明白,我们有不同的编译器和不同的STL实现(可能)。它们可以有不同的警告或标记来抑制警告,这是正常的。但它是不同的运行时错误行为。这正常吗?我能以某种方式"启用"所有运行时错误吗?
这些类型的for循环不是用来改变容器本身的。您使仍在使用的迭代器失效,因此任何事情都可能发生。因为这是未定义的行为,编译器被允许生成任何的代码,没有任何保证,所以两个编译器都是正确的。
你的观察是由于msvc默认情况下为调试构建启用一些运行时检查,而gcc没有。
您可以在编译期间启用libstd++
(gcc的标准库实现)和-D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC
的运行时检查。它将显示示例中的一个错误。(生活)
我们都清楚了,这段代码:
std::map<int, Obj*> workMap
for(auto a : workMap)
workMap.erase(a.first);
导致未定义的行为,应该期望而不是正常工作。
Visual Studio只是提供了帮助,并提供了一个运行时错误。它没有义务这样做
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 从不同线程使用int64的不同字节安全吗
- C/C++编译器通常会删除重复的库吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 有与__builtin__FUNCTION()等效的MSVC吗
- 看起来is_nothrow_constructible_v()在MSVC中被破坏了,我错了吗
- MSVC 无法根据模板参数进行数学运算,这是一个错误吗?
- 这是MSVC 2013中具有共享PTR的单例的正确实现吗?
- MSVC发现这种方法调用模棱两可,而Clang / GCC则不然吗?
- 使用lambda中捕获的常量值作为模板参数合法吗
- 可以在linux程序中使用msvc在windows上构建的boost lib吗
- 这是 MSVC 中依赖名称解析中的错误吗?
- 为什么gcc和msvc允许const对象没有用户提供的构造函数?这是个bug吗
- MSVC可以自动优化这种情况吗?
- msvc版本中的链接器不匹配.有什么变通办法吗
- mingw和msvc之间的这种差异正常吗?
- 可以在LLVM / MSVC上编译try-catch块吗?
- 在windows上编译MSVC是严格必要的吗?
- c++ 11线程API: MSVC 2010有免费的实现吗?
- 在Windows上,GCC比MSVC更值得使用吗?