如何编写其指针和数据为const的unique_ptr

use*_*130 7 c++ unique-ptr

我第一次尝试编写一个基于for循环的范围来迭代unique_ptrs我写道:

std::vector<std::unique_ptr<Foo>> vec;
// Initialize vec

for (auto v : vec) // error
{}
Run Code Online (Sandbox Code Playgroud)

然后我意识到这是尝试使用unique_ptr创建每个元素的副本.那么我把它写成参考:

for (auto& v : vec)
{}
Run Code Online (Sandbox Code Playgroud)

在它前面添加一个const使我无法更改指针.

for (const auto& v : vec)
{
   v = nullptr; // error (good!)
}
Run Code Online (Sandbox Code Playgroud)

如何编写它,以便指向的数据无法更改?例如,以下代码不应编译.

for (??? v : vec)
{
   v->func();
}

class Foo
{
public:
   void func();

private:
   bool mBar;
}

Foo::func()
{
   mbar = true; // Should cause error
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*eld 5

要防止数据被修改,请const在指针的模板参数中包含:

std::vector<std::unique_ptr<const Foo>> vec;
Run Code Online (Sandbox Code Playgroud)

我认为你在制作指针本身时会遇到问题const.原因是向量必须能够在内部复制指针对象(例如,在调整容器大小时).使用a unique_ptr,这意味着必须在实例之间传输所有权,这意味着它必须是可变的(而不是const).

为了使指针本身const,我认为你有两个主要选择:使用矢量const shared_ptr<>或数组(即固定大小)const unique_ptr<>.