我正在尝试使用指向使用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保证。

注意:我发现的一种解决方案是在process()中创建一个新的unique_ptr<const T2DMatrix>对象,使用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

08-16 00:43