unique_ptr
사본을 만들지 않으려 고하면 사용할 수 있습니다. shared_ptr
처럼 포인터의 값을 얻으려면 이터레이터를 "이중 참조 해제"해야합니다.
Ptr p = v[0];
다음은 컴파일 시간에 찾을 수 있습니다 :
#include <vector>
#include <memory>
#include <iostream>
template <class C>
void
display(const C& c)
{
std::cout << '{';
if (!c.empty())
std::cout << *c.front();
for (auto i = std::next(c.begin()); i != c.end(); ++i)
std::cout << ", " << **i;
std::cout << "}\n";
}
int main()
{
typedef std::unique_ptr<int> Ptr;
std::vector<Ptr> v;
for (int i = 1; i <= 5; ++i)
v.push_back(Ptr(new int(i)));
display(v);
for (auto i = v.begin(); i != v.end(); ++i)
**i += 2;
display(v);
}
당신이 할 경우 (실수)를 unique_ptr
의 복사본을 만들 : 여기에 간단한 예입니다. 런타임 오류가 발생하지 않습니다. 유스 케이스가 container<unique_ptr<T>>
이 만들어진 이유입니다. 상황은 정상적으로 작동해야하며 그렇지 않은 경우 문제는 런타임 대신 컴파일 타임에 나타납니다. 따라서 코드를 제거하고 컴파일 시간 오류를 이해하지 못하면 다른 질문을 다시 여기에 요청하십시오. auto
와
좋아, 나는 그것이 나를 위해 일을 명확히한다고 생각한다. 나는 새로운 for_each 함수를 사용하는 습관을 지녔지 만 매개 변수가 값으로 전달 된 요소 인 람다를 참조로 사용하지는 않았지만 시도하지 않으려면 unique_ptr 요소에 대한 참조를 만들어야 할 것입니다. 복사/이동. 추신 한 번 반복자를 참조 해제하고 그 결과에 대한 참조를 취하는 경우이 시도가 시도되지 않았다고 가정합니다. 내 말은 : 'for (Container :: iterator it = container.begin(); it! = container.end(); it ++) { unique_ptr & 요소 = &*it; // 시도하지 않은 복사본? }' 감사합니다. Howard, btw. –
예, 정상적으로 작동해야합니다. 비록 코드에 여분의 '&'가 있습니다. 그러나 컴파일러가 어디에서 알려줄 것입니다. –
다음과 같이 역 참조 할 수 있어야합니다 : blah & element = ** it; 여전히 복사본이없는 것 같습니다. (아마도 더 유용 할 것입니다.) –