2017-04-08 27 views
5

下面的代码在Linux和Visual Studio 2015年的std ::地图实现Linux和Windows

#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编译后的行为之间的不同有所不同在linux编译克++ -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上工作的任务。

+3

我想知道为什么你会想要这样的地图。 –

回答

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

膨胀以

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

C++使得关于是否operator[]size首先被调用没有保证,因为两者都是操作数赋值表达式。这两个编译器都是正确的。

如果您期待一种行为或其他行为,则应将表达式分为两个语句。

+0

不知道。我认为分配的正确方面总是首先被调用。 –

+3

@lazytraveller进一步扩展了:: :: operator =(map1.operator [](i),map1.size())'。函数调用的参数没有相互排序。 –

+0

@aschelper如果程序的行为取决于操作数评估的(未指定的)顺序,那么行为是否仍然定义(与未定义或实现定义相反)? –