2010-05-14 4 views
4

나는이를 통해 일부 부스트 코드를 읽기, 온되었다왜 할당 연산자가 일치하는 생성자와 다른 것을 수행하게됩니까?

inline sparse_vector &assign_temporary(sparse_vector &v) { 
    swap(v); 
    return *this; 
} 
template<class AE> 
    inline sparse_vector &operator=(const sparse_vector<AE> &ae) { 
     self_type temporary(ae); 
     return assign_temporary(temporary); 
    } 

그것은 대입 연산자에 생성자의 모든 매핑 할 것으로 보인다. 큰. 하지만 C++이 왜 다른 일을하도록 선택 했나요? 제가 생각할 수있는 것은 scoped_ptr입니까?

답변

6

왜 C++은 다른 것들을하도록 선택 했습니까?

할당이 완전하게 구성된 개체에서 작동하기 때문입니다. 리소스 관리 클래스에서는 모든 멤버 포인터가 이미 리소스를 가리키는 것을 의미합니다. 이것을 구성원에게 실행하기 전에 의미가없는 생성자와 대조하십시오.

덧붙여서, C++의 초창기에는 T a(b);가 실제로 T a; a = b;으로 정의되었지만 비효율적이었습니다. 따라서 복사 생성자가 도입되었습니다.

2

"assign_temporary"라는 이름이 임시 임으로 할당 과정에서 소멸 될 수 있음을 나타냅니다. 대입 연산자는 나중에 사용하기를 원할 수있는 정규 객체를 필요로하므로 할당 도중 파기하는 옵션이 아닙니다. 이 부스트 코드에서 "assign_temporary"는 rvalue reference 할당 연산자와 동의어입니다. 위에 표시된 대입 연산자는 표준 const (lvalue) 참조 할당 연산자이므로,이 두 가지 유형의 불일치가 예상됩니다 .

대입 연산자는 일반적으로 복사 및 스왑 트릭을 사용하여 구현된다는 점에 동의합니다 (복사 생성자를 사용하여 복사본을 만든 다음 복사본으로 바꾸기). 그러나이 표준은 명시 적 정의가 없으면 컴파일러에서 대입 연산자의 자동 구현을 이미 정의하므로 기본 구현을 변경하면 기존 코드가 손상 될 수 있습니다.

1

일부 클래스는 때때로 할당되거나 복사되지 않아야하기 때문에. 예를 들어, RAII를 사용하면 잠금을 연 mutex 클래스를 빌드 한 다음 만료시 잠금을 닫을 수 있습니다. 그러한 클래스를 복사하거나 할당 할 수 있다면 함수 범위 밖에서 클래스를 전달할 수 있습니다. 이것은 나쁜 사람들의 손에 나쁜 일을 일으킬 수 있습니다.

관련 문제