2017-04-08 21 views
5

Poniższy kod działa inaczej po kompilowane w systemie Linux i Visual Studio 2015.std :: map realizacja zależy od linux i 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; 
} 

wynik w Visual Studio:

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

Wynik w skompilujesz z g ++ -std = C++ 11 -Wall -pedantic

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

Mam dwa pytania:

  1. O ile mi zrozumieć, C++, realizacja VS ma rację.
    Gdybym zmienić kod do:

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

wtedy zachowuje się jak Visual Studio na obu platformach.
Czy ten kod nie powinien zachowywać się w ten sposób?

2. Jakie ustawienia kompilatora Visual Studio mogę użyć, aby upewnić się, że VS skompiluje się tak samo jak Linux?
Pracuję w systemie Windows, ale mam zadanie, które musi działać w systemie Linux.

+3

Zastanawiam się, dlaczego chcesz taką mapę. –

Odpowiedz

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

rozszerza się

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

C++ nie udziela żadnych gwarancji, czy operator[] lub size nazywa się pierwszy, ponieważ oba są argumenty do wyrażenia przypisania. Oba kompilatory są poprawne.

Powinieneś podzielić swoje wyrażenie na dwie instrukcje, jeśli spodziewasz się jednego lub drugiego zachowania.

+0

Nie wiedziałem o tym. Myślałem, że właściwa strona zadania zawsze zostanie wywołana jako pierwsza. –

+3

@lazytraveller Rozszerzony dalej ':: operator = (map1.operator [] (i), map1.size())'. Parametry wywołania funkcji nie są sekwencjonowane względem siebie. –

+0

@aschelper Czy zachowanie jest nadal zdefiniowane (w przeciwieństwie do niezdefiniowanej lub zdefiniowanej implementacji), jeśli zachowanie programu zależy od (nieokreślonej) kolejności oceny operandu? –

Powiązane problemy