2017-04-08 5 views
5

다음 코드는 리눅스 및 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에서 결과에 컴파일 된 후 다른 역할을 사이에 차이가 리눅스에서 g ++ -std = C++ 11 - 벽 -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; 
} 
다음은 두 플랫폼에서 비주얼 스튜디오처럼 동작 :
는 내가 코드를 변경하는 경우.
코드가 항상 이와 같이 작동하면 안됩니까?

2. VS가 Linux와 동일한 컴파일 작업을 수행하기 위해 사용할 수있는 Visual Studio 컴파일러 설정은 무엇입니까?
저는 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 프로그램의 동작이 피연산자 평가의 (지정되지 않은) 순서에 따라 다르면 동작이 정의되어 있습니까 (정의되지 않은 것과는 달리 또는 구현이 정의되어 있습니까?)? –