C++ Unique_ptr 상수 참조
-
23-12-2019 - |
문제
리소스 처리를 단순화하기 위해 포인터를 사용하는 솔루션을 Unique_ptr을 사용하는 솔루션으로 마이그레이션하려고 합니다.나는 이동 의미와 사용법을 알고 있습니다. std::move()
Unique_ptr로 작업합니다.
현재 나는 서명이 있는 기능을 가지고 있습니다. int foo(const T2DMatrix* m)
동적으로 할당된 2D 매트릭스 객체를 사용하여 이를 호출합니다.함수 foo
T2DMatrix 클래스에 대한 읽기 전용 액세스만 필요하므로 const 인수가 필요합니다.이제 이것을 다음으로 마이그레이션했습니다. int foo(unique_ptr<const T2DMatrix>& m)
.다른 기능에서, process()
, 이는 unique_ptr<T2DMatrix>
(팩토리 함수를 사용하여 생성된) 개체를 foo에 매개변수로 전달하고 싶습니다.그러나 컴파일러는 그렇게 하는 것을 허용하지 않습니다.나는 객체의 소유권을 다음으로부터 이전하고 싶지 않습니다. process()
에게 foo()
, 따라서 참조를 사용합니다.foo() 호출하기 unique_ptr<const T2DMatrix>
잘 작동하지만 함수 서명을 변경하면 const 보장이 적용되지 않습니다.
메모:내가 찾은 한 가지 해결책은 새로운 것을 만드는 것입니다. unique_ptr<const T2DMatrix>
process()의 객체, 원본에서 소유권을 이전합니다. unique_ptr<T2DMatrix>
객체를 사용하여 std::move()
, foo()에 전달하고 process()에서 다시 소유권을 이전합니다.그러나 이것은 이상적인 해결책은 아닌 것 같습니다.
T2DMatrix* 인수를 const T2DMatrix* 매개변수에 전달할 수 있는 포인터 솔루션을 제안해 주십시오.msvc2012, msvc2013 및 g++4.8을 사용해 보았지만 모두 동일한 결과를 얻었습니다.
해결책
함수에 소유권이 필요하지 않은 경우 참조 대신 일반 참조를 전달하세요. unique_ptr
:
int foo(T2DMatrix const& m);
std::unique_ptr<T2DMatrix> matrixptr;
[...]
foo(*matrixptr);
인위적으로 제한할 필요가 없습니다. foo
에게 unique_ptr
s 함수가 어쨌든 소유권에 관심이 없는 경우.