왜 그것이 잘못 사용하는 std::auto_ptr<>표준 컨테이너?
문제
왜 그것이 잘못 사용 std::auto_ptr<>
표준 컨테이너?
해결책
C++표준 STL 요소가 있어야 합"복사이 가능하고"및"양도할 수 없습니다." 다시 말해서,요소가 될 수 있어야 할당되거나 복사하고 다음과 같은 두 가지 요소가 논리적으로 독립적이다. std::auto_ptr
을 수행하지 않습니다.
예를 들어 이 코드:
class X
{
};
std::vector<std::auto_ptr<X> > vecX;
vecX.push_back(new X);
std::auto_ptr<X> pX = vecX[0]; // vecX[0] is assigned NULL.
이러한 한계를 극복하기 위해 사용해야 합니다 std::unique_ptr
, std::shared_ptr
나 std::weak_ptr
스마트 포인터 또는 부스트 동등이 없는 경우 C++11. 여기에 향상 라이브러리에 대한 문서 이러한 스마트 포인터입니다.
다른 팁
이 본 의미 의 auto_ptr
와 호환 되지 않는 용기입니다.
특히,복사 하나 auto_ptr
을 다 만들지 않는 동일한 두 개체 중 하나가 소유권의 포인터이다.
더 구체적으로 복사 auto_ptr
원인 중 하나의 복사본을 가게의 포인터이다.는 이들의 유 컨테이너에 정의되어 있지 않습니다.따라서,무작위로 할 수 있습을 잃게 액세스 포인터를 저장하는 경우 auto_ptrs
에서 컨테이너입니다.
두 개의 최고 우수한 제목에 기사:
STL 컨테이너해야 복사할 수 있는 항목을 저장소에서,그리고 설계 기대하는 원본과 복사본을 것 같습니다.자동차 포인터를 객체가 완전히 다른 계약,그것에 의하여 복사를 만들의 소유입니다.즉,용기의 auto_ptr 전시할 것입니다 이상한 행동에 따라 사용합니다.
거기에 대한 자세한 설명에서 잘못 될 수 있는 효과적인 STL(스코트 마이어스)항목을 8 과도 그렇지 못한 자세한 설명에서 효과적인 C++(스코트 마이어스)13.
STL 컨테이너 저장의 사본을 포함되는 항목입니다.면 auto_ptr 복사,그것은 세전 ptr null.많은 컨테이너 방법은 이 행동입니다.
C++03 표준(ISO-IEC14882-2003) 에서 말하는 절 20.4.5 제 3 항:
[...] [참고:[...] auto_ptr 을 충족하지 않 CopyConstructible 및 할당 요구사항에 대한 표준 라이브러리 컨테이너 요소 및 따라서 인스턴스화하는 표준 라이브러리 컨테이너 로 auto_ptr 결과에서 정의되지 않은 행동이다.—엔드 노트]
C++11 표준(ISO-IEC14882-2011) 에서 말하는 것 부록 D.10.1 단락을 3:
[...] 참고:[...]의 인스턴스 auto_ptr 의 요구 사항을 충족 MoveConstructible 및 MoveAssignable 지만,요구 사항을 충족하지 않는 의 CopyConstructible 및 CopyAssignable.—end 참고]
C++14 표준(ISO-IEC14882-2014) 에서 말하는 것 부록 C.4.2 Annex D:호환성 기능:
변경:클래스 템플릿 auto_ptr,unary_function 및 binary_function,기능 템플릿 random_shuffle 고 기능 템플릿(그리고 자신의 복귀형)ptr_fun,mem_fun, mem_fun_ref,bind1st 및 bind2nd 는 정의되지 않았습니다.
이론적 설명:대체하여 새로운 기능을 제공합니다.
에 효과 원래 기능:유효한 C++2014 코드를 사용하는 이러한 클래스 템플릿 및 기능 템플릿에 실패할 수 있게 컴파일에서 이 국제 표준입니다.