2012-11-22 3 views
1

에 포함 된 개체에 대한 요구 사항은 무엇입니까, 허브 셔터는 약 auto_ptr 썼다 때문에,뛰어난 C++에서 벡터

문제는 매우 당신이 용기에 넣을 수 유형의 요구 사항을 충족하지 않는 auto_ptr은이다 auto_ptrs의 사본은 과 동일하지 않습니다.

이 책은 C++ 03과 관련하여 작성하고,이 코드는 완벽하게 GCC 4.7.1에서 컴파일 할 것 같다 나는이 여전히 유효한지 여부를 궁금해했다 :

#include <vector> 

struct Foo 
{ 
    Foo() { } 
    Foo(Foo&&) { } 
    Foo(Foo&) = delete; 
    Foo& operator= (Foo&&) { return *this; } 
    Foo& operator= (Foo&) = delete; 
}; 

int main() 
{ 
    std::vector<Foo> bar; 
    bar.push_back(Foo()); 
} 

그러나 받아들이는 moveable- 복사 할 수없는 객체도 GCC 확장이 될 수 있습니다. 나는 잘 모르겠다. std::vector 개체의 요구 사항은 무엇입니까?

+1

은 조금 복잡하다 벡터 인스턴스에서 수행 할 작업 및 사용하는 생성자 – juanchopanza

답변

5

하는 std::vector<Foo>::push_back()을 사용할 수 있도록, 종류 Foo이 있어야 MoveInsertable 또는 CopyInsertable (23.2.1 [container.requirements.general] 문단 13) 23.2.3에 따른 [sequence.rqmts] 제 16 (표 101) . 분명히 모델을 제공하려면 push_back()에 r 값이 있어야하며 가능하면 std::move(x)을 사용하여 계산해야합니다. 즉, std::vector<...>::push_back()을 사용하려면 이동 지정 연산자가 필요하지 않습니다. 모든 표준 라이브러리가 올바르게이 후반 부분을 올바르게 고려하지 않고 insert()에 위임한다고 생각하지 않습니다. insert()도 위임 형식이 MoveAssignable 또는 CopyAssignable이어야하기 때문에 insert()에 대한 위임이 C++ 2011 표준에 따라 작동하지 않습니다. 불행하게도 이름이 push_과 줄 바꿈에 의해 back()로 분할되어 있기 때문에 나를 위해 표 (101)를 가리 키도록 실패 push_back를 검색하려고

... 지금은 요구 사항이에 의존하기 때문에

+0

OK, 벡터에서'std :: sort'와 같은 알고리즘을 사용하는 것은 어떻습니까? 이동성이 유일한 요구 사항이라는 것을 확신 할 수 있습니까? – qdii

+0

@qdii : 나는'push_back()'을 사용하기 위해 무엇이 필요한지 질문에 답하고 있었다. 다른 작업 (예 :'insert() '사용)에는 다른 요구 사항이 있으며/또는 구체적인 의미가 있습니다. 각 멤버 함수 및/또는 알고리즘에 대한 요구 사항을 검토해야합니다. –