c++ - std::map 实现在 linux 和 windows 之间不同

标签 c++ linux visual-studio-2015 stdmap

以下代码在 linux 和 Visual Studio 2015 中编译后表现不同。

#include <map>
#include <iostream>
using namespace std;

int main(void)
{
    map<int, int> map1;
    int keyCount = 2;

    for (int i = 0; i < keyCount; i++)
    {
        map1[i] = map1.size();
    }

for (auto value : map1) 
    {
        cout << "key: " << value.first << " value: " << value.second << endl;
    }
return 0;
}

Visual Studio 中的结果:

key: 0 value: 0
key: 1 value: 1

Linux 中使用 g++ -std=c++11 -Wall -pedantic 编译的结果

key: 0 value: 1
key: 1 value: 2

我有两个问题:

  1. 就我对c++的理解,VS实现是对的。
    如果我将代码更改为:

    for (int i=0; i < keyCount; i++)
    {
        unsigned int mapSize= map1.size();
        map1[i] = mapSize; 
    }
    

然后它在两个平台上的行为都像 Visual Studio。
代码不应该总是这样吗?

2.我可以使用哪些 Visual Studio 编译器设置来确保 VS 的编译与 Linux 相同?
我在 Windows 上工作,但有一个任务必须在 Linux 上工作。

最佳答案

map1[i] = map1.size();

扩展为

(map1.operator[](i)) = (map1.size());

C++ 不保证是否首先调用 operator[]size,因为它们都是赋值表达式的操作数。两个编译器都是正确的。

如果您期望一种行为或另一种行为,您应该将表达式拆分为两个语句。

关于c++ - std::map 实现在 linux 和 windows 之间不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43299595/

相关文章:

razor - VS 2015 Razor 自动完成/智能感知下拉菜单在下拉菜单后立即隐藏

c++ - 在 C++ 中使用全局变量的最佳方法是什么?

c# - 如何在 visual studio 中为 c# 文件中的所有行设置断点?

asp.net - Visual Studio 2015、ASP.NET 5、MVC 6、Angular 2.0 - 异常 : Token must be defined

c - 实时了解 localtime() 与 localtime_r() 中的时区变化

python - 如何找到Python服务器上存储的 secret 哈希值?

linux - Bash,将文件从文件夹复制到另一个

c++ - C++ 中的指针 : How large should an object be to need use of a pointer?

c++ - 动态链接和 Python SWIG (C++) 在 C++ 中工作在 python 中失败

c++ - C++ 标准库中是否有保证不执行动态内存分配的函数或类?