문제

리소스 처리를 단순화하기 위해 포인터를 사용하는 솔루션을 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_ptrs 함수가 어쨌든 소유권에 관심이 없는 경우.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top