std::make_unique
표준 C ++ 11 라이브러리에 함수 템플릿 이없는 이유는 무엇 입니까? 나는 찾는다
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
조금 장황하다. 다음이 훨씬 좋지 않을까요?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
이것은 new
멋지게 숨기고 유형을 한 번만 언급합니다.
어쨌든, 여기에 구현하려는 나의 시도는 make_unique
다음 과 같습니다.
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
std::forward
물건을 컴파일 하는 데 꽤 오랜 시간이 걸렸지 만 그것이 맞는지 확실하지 않습니다. 그렇습니까? 정확히 무엇을 std::forward<Args>(args)...
의미합니까? 컴파일러는 무엇을 만드는가?
make_unique
분명히 일반 구를 통해 할당하기 때문에, 사용자 정의 Deleter가와를 new
따라서하고 있어야 사용 평범한 구식 delete
:
make_unique
은 new
할당 으로 제한됩니다 ... 글쎄, 작성하고 싶다면 괜찮지 만 왜 그런 것이 표준의 일부가 아닌지 알 수 있습니다.
make_unique
의 생성자 std::unique_ptr
가 명시 적이므로 템플릿 을 사용하고 싶습니다. 따라서 unique_ptr
함수에서 반환하는 것이 장황 합니다. 또한, 차라리 사용하는 것 auto p = make_unique<foo>(bar, baz)
보다std::unique_ptr<foo> p(new foo(bar, baz))
.
unique_ptr
두 번째 템플릿 매개 변수를 취해야한다shared_ptr
.