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;
}
하지만 그 복사 연산자를 사용하고 말한대로이 컴파일되지 않습니다 : 여기 최소 예를 들어이 감소했다.
나는 이것이 바보 같은 질문이라고 확신하지만, 나는 C++을 처음 접했고 사본이 어디에 있는지를 고민하고있다. 이동 수정이 필요로
, 당신은
@NicolBolas 왜 당신은 좌변 참조를 제거 했습니까? 정말 읽을 수있는 것은 아니지만 여전히 효과가 있습니다. – Slava
물론 작동 할 것입니다. 그러나 사람들에게 나쁜 아이디어를주는 것은 나쁜 생각입니다. 그리고 lvalue reference에서 움직이는 것은 거의 틀림 없습니다. 즉, 함수가 호출 된 사이트에서 객체가 이동한다는 표시가 없음을 의미합니다. 그리고 물체에서 움직이는 것이 정의되지 않은 상태로 남기 때문에, 나중에 그것을 사용하는 것은 모호합니다. 이를 방지하는 것이'std :: move'와 rvalue references *가 존재하는 이유 중 큰 부분입니다. 물론 다른 이유는 lvalue 참조 매개 변수에 prvalue를 전달할 수 없다는 것입니다. –
"이것은 함수가 호출 된 사이트에서 객체가 이동한다는 표시가 없음을 의미합니다." 네,하지만 유감스럽게도 lvalue 참조가 전달 된 거의 모든 호출에 해당합니다. 메서드는이를 변경하려고하지만 호출하는 사이트에는 아무런 표시가 없습니다. 그러나 이것은 일반적으로 lvalue 참조를 지나가는 것을 금지하는 충분한 이유라고 확신하지 못합니다. – Slava