2011-12-09 2 views
1

나는 다음과 같은 코드가 C++ :(11)의 shared_ptr을 할당

#include <memory> 

    int main(void) 
    { 
     std::shared_ptr<int> currInt(nullptr); 

     std::shared_ptr<int> newInt(new int); 
     currInt = newInt; 

     return 0; 
    } 

그것은이는 것으로 나타났다을 유효하지 않은 C++ 11 (이 초안 버전으로 사용) 및 할당 생성자가 이제 이동 의미를 사용합니다. 내가 이해하지 못하는 것.

누군가 제발 그것을 어떻게 만들 수 위의 코드를 수정 줄 수 설명해 주시겠습니까?

+1

과제가 이동 의미론을 사용해서는 안됩니다. 'unique_ptr'이 무엇을위한 것입니까? 예상치 못한 행동은 정확히 무엇입니까? –

+1

C++ 11에서는 shared_ptr의 복사 생성자가 이동 생성자를 위해 삭제됩니다. 나는 이동의 의미를 많이 이해하지 못한다. Clang 3.0에서 이것을 컴파일하려고하면 오류를 직접 볼 수 있습니다. – Jookia

+2

나는 그것이 그렇게 믿지 않는다. [이 페이지] (http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr)를 확인하십시오. 내 지식으로는 정보가 최신 정보입니다. 또한이 코드는 GCC 4.6.1에서 컴파일됩니다. 이것이 나에게 의미가없는 가장 큰 이유는 이동 의미론에서 이동 된 객체가 "빈 상태"로 남아 있어야한다는 것입니다. 이것은'shared_ptr'에서는 분명히 바람직하지 않습니다. 내가 틀렸다면 나를 바로 잡아주세요. –

답변

5

shared_ptr에 대한 복사 생성자가 있습니다. 그렇지 않은 경우 shared_ptr의 요점은 무엇입니까?

OP에 의한 clang link

만 이동 할당 연산자가 정의되면, 복사 생성자가 암시 적으로 shared_ptr가 제대로 행동하지 만들고, 삭제됩니다 말하고있다. 이는 Boost changeset에서도 볼 수 있습니다. 복사 할당 연산자는 이고 명시 적으로 버그 수정을 위해이 추가되었습니다.

§20.7.2.2.3 [util.smartptr.shared.assign]/1-3에서 shared_ptr의 복사 할당 연산자를 찾을 수 있습니다.

shared_ptr& operator=(const shared_ptr& r) noexcept; 
template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r) noexcept; 
template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r); 
+1

아, 버그예요. – Jookia

+2

첫 번째 연산자 만 _copy_ 할당 연산자이고 두 번째 연산자는 대입 연산자입니다./pedantic; -] – ildjarn

관련 문제