std :: map实现在linux和windows之间有所不同

时间:2017-04-08 19:41:50

标签: 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

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

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; 
    }
    
  2. 然后它在两个平台上都像Visual Studio一样 代码的行为是否总是这样?

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

1 个答案:

答案 0 :(得分:10)

map1[i] = map1.size();

扩展为

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

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

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