2017-11-15 1 views
2

고유 한 ptrs 벡터를 클래스에 저장 한 고유 한 ptrs 벡터로 이동하고 싶습니다. 이 Inserting a vector of unique_ptr into another vector고유 한 ptr 벡터를 다른 멤버 함수를 통해 추가하십시오.

에서 답을 따르려고 노력

#include <iostream> 
#include <memory> 
#include <vector> 
using namespace std; 

class A 
{ 
public: 
    A() = default; 
}; 


class B 
{ 

public: 

    void AddAs(const vector<unique_ptr<A>>& vv) 
    { 

     vec.insert(vec.end(), 
      std::make_move_iterator(vv.begin()), 
      std::make_move_iterator(vv.end()) 
     ); 
    } 

    vector<unique_ptr<A>> vec; 
}; 


int main() {  
    vector<unique_ptr<A>> v; 
    for(int i=0; i<10; ++i) 
    { 
     v.push_back(make_unique<A>()); 
    } 
    B b; 
    b.AddAs(v); 

    return 0; 
} 

https://ideone.com/76iNIM

하지만 그 복사 연산자를 사용하고 말한대로이 컴파일되지 않습니다 : 여기 최소 예를 들어이 감소했다.

나는 이것이 바보 같은 질문이라고 확신하지만, 나는 C++을 처음 접했고 사본이 어디에 있는지를 고민하고있다. 이동 수정이 필요로

, 당신은

답변

1

당신은 const를 참조로 전달하는 것이, 벡터에서 이동할 수 없습니다 감사합니다. 독자를 같이 실제로 좋은

b.AddAs(std::move(v)); 

:

이 값에 의해 전달
void AddAs(vector<unique_ptr<A>>&& vv) 

도 작동합니다 :

void AddAs(vector<unique_ptr<A>> vv) 

참고하면 코드를 호출 변경해야 그래서 방법을 변경 그 벡터는 옮겨 질 것입니다.

live example

+0

@NicolBolas 왜 당신은 좌변 참조를 제거 했습니까? 정말 읽을 수있는 것은 아니지만 여전히 효과가 있습니다. – Slava

+0

물론 작동 할 것입니다. 그러나 사람들에게 나쁜 아이디어를주는 것은 나쁜 생각입니다. 그리고 lvalue reference에서 움직이는 것은 거의 틀림 없습니다. 즉, 함수가 호출 된 사이트에서 객체가 이동한다는 표시가 없음을 의미합니다. 그리고 물체에서 움직이는 것이 정의되지 않은 상태로 남기 때문에, 나중에 그것을 사용하는 것은 모호합니다. 이를 방지하는 것이'std :: move'와 rvalue references *가 존재하는 이유 중 큰 부분입니다. 물론 다른 이유는 lvalue 참조 매개 변수에 prvalue를 전달할 수 없다는 것입니다. –

+0

"이것은 함수가 호출 된 사이트에서 객체가 이동한다는 표시가 없음을 의미합니다." 네,하지만 유감스럽게도 lvalue 참조가 전달 된 거의 모든 호출에 해당합니다. 메서드는이를 변경하려고하지만 호출하는 사이트에는 아무런 표시가 없습니다. 그러나 이것은 일반적으로 lvalue 참조를 지나가는 것을 금지하는 충분한 이유라고 확신하지 못합니다. – Slava

관련 문제