我第一次尝试编写一个基于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)
要防止数据被修改,请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<>.