C ++ unique_ptr常量引用

时间:2014-02-27 09:23:51

标签: c++ pointers c++11 const unique-ptr

我正在尝试使用unique_ptr将指针迁移到一个解决方案,以简化资源处理。我知道移动语义和使用std::move()来处理unique_ptr。

目前我有一个带有签名int foo(const T2DMatrix* m)的函数,我使用动态分配的2D-Matrix对象来调用它。函数foo只需要对T2DMatrix类的只读访问权限,因此需要const参数。现在,我已将其迁移到int foo(unique_ptr<const T2DMatrix>& m)。从另一个函数process(),它有一个unique_ptr<T2DMatrix>对象(使用工厂函数创建),我想将对象作为参数传递给foo。但是,编译器不允许我这样做。请注意,我不想将对象的所有权从process()转移到foo(),因此使用了引用。使用unique_ptr<const T2DMatrix>调用foo()可以正常工作,但是如果我更改函数签名,则不会强制执行const保证。

注意:我发现的一个解决方案是在进程()中创建一个新的unique_ptr<const T2DMatrix>对象,使用unique_ptr<T2DMatrix>从原始std::move()对象转移所有权,将其传递给foo(),并再次在process()中转移所有权。但这似乎不是理想的解决方案。

请建议等效的指针解决方案,它允许我将T2DMatrix *参数传递给const T2DMatrix *参数。我尝试使用msvc2012,msvc2013和g ++ 4.8,都具有相同的结果。

1 个答案:

答案 0 :(得分:19)

如果该功能不需要所有权,请传递普通参考而不是unique_ptr的参考:

int foo(T2DMatrix const& m);


std::unique_ptr<T2DMatrix> matrixptr;
[...]
foo(*matrixptr);

如果函数不关心所有权,则无需人为地约束foounique_ptr