2014-11-20 2 views
0

아래 코드에서이 구조체에 std::map이 있습니다. 그리고 저는 이제 구조의 인스턴스를 다른 인스턴스에 할당하고 있습니다. 구조체에는 대입 연산자가 없습니다. 이 경우 맵의 할당 연산자가 호출되거나 컴파일러가 구조의 얕은 복사본 메모리를 포함 할 것으로 예상됩니까? std :: map 멤버가있는 구조 할당

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    struct vectstruct 
    { 
     std::map<int, double> mymap; 
    }; 
    vectstruct vs1, vs2; 
    vs1.mymap[7] = 54.321; 
    vs2 = vs1; // Should call assignment operator of map vs2.mymap 
    vs1.mymap[7] = 65.432; 
    return 0; 
} 

나는 Microsft 비주얼 스튜디오와 내가 예상대로 vs2.mymap[7]의 값이 54.321 남아 참조 프로그램의 마지막에이 시도. 하지만 C++ 표준에 맞는지 아니면 명시 적으로지도의 대입 연산자를 호출 할 vectstruct의 대입 연산자를 작성해야하는지 알고 싶습니다.

+1

일반적으로 모든 데이터 멤버가 제대로 작동하면 복사 생성자 또는 할당 연산자를 쓰지 마십시오 (이 경우). 멤버 (예 : 포인터)를 관리 할 때만 필요합니다 (none 규칙, three 규칙, five 규칙 (C++ 11) 참조). –

답변

2

스타일의 문제로, main 외부에서 유형을 선언하고 정의해야합니다.

즉, 복사 할당 연산자를 제공하지 않으면 컴파일러에서 암시 적으로 * 하나를 만들고 암시 적으로 하나만 요소별로 복사본 할당을 수행합니다. 당신이 예상해야한다 코드의 끝에 있도록

std::map를 들어
vectstruct& operator=(const vectstruct& rhs) { 
    mymap = rhs.mymap; 
    return *this; 
} 

, 할당은 전체 복사,은, 참조를하지 않습니다 않습니다 :처럼이 경우, 암시 하나가 보일 것입니다

vs2.mymap[7] == 54.321 // to the extent that equality of doubles is a thing 
vs1.mymap[7] == 65.432 

* 컴파일러 이 기본적으로 복사 할 수없는 멤버가있는 개체로 끓는 암시 적 할당 연산자를 만들 수없는 경우가 있습니다. 예를 들어, 참조 또는 unique_ptr.

1

기본값 인 operator=은 예상대로 구성원 별 복사본을 수행합니다. I. e. 구조체의 모든 데이터 멤버에 대해 operator=을 호출합니다. std::map은 차례로 operator=을 구현하므로 모든 것이 매력적으로 작동합니다. 동일한 연산자를 직접 작성하여 코드를 부 풀릴 필요가 없습니다.