2017-04-08 52 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如果程序的行爲取決於操作數評估的(未指定的)順序,那麼行爲是否仍然定義(與未定義或實現定義相反)? –