我正在尝试使用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(), ,因此使用引用。用一个 unique_ptr<const T2DMatrix> 工作正常,但是如果我更改函数签名,则不会强制执行const保证。

注:我发现的一个解决方案是创建一个新的 unique_ptr<const T2DMatrix> object in 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);

没有必要人为地约束 foounique_ptrs如果函数无论如何都不关心所有权。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top