返回const对象的const向量的const向量

C++ - returning a const vector of const vectors of const objects

本文关键字:const 向量 对象 返回      更新时间:2023-10-16

我正在解析一个文件并创建Foo对象向量的向量。

vector< vector<Foo*> > mFooVectors;

我必须允许使用以下getfoo函数进行访问。

const vector<const Foo*>&         getFoos(int index); 
所以我为vector创建了一个const声明:
const vector< const vector<const Foo*> > mConstFooVectors;

现在我怎么做mConstFooVectors = mFooVectors所以我可以返回一个引用mConstFooVectors?

您不能在任何给定级别轻松添加const。模板的不同实例化是不同的不相关类型,vector<T>vector<const T>不相关,并且无法将从一个转换到另一个。

另一方面,您可以创建一个不同的向量并复制其内容,但这可能会很昂贵,因为您必须复制所有不同的包含向量。

顺便说一下,如果您向外部向量返回一个const引用,那么该const引用将表现为:const std::vector< const std::vector< Foo * const > >&,请注意,由于c++中与类型相关的值语义,const-ness 在中传播。问题在于,存储在内部向量中的值是一个指针,使该指针为常量并不能使所指向的对象为常量。同样,getFoos(int)的行为将等同于const std::vector< Foo * const >&。注意,这是行为而不是实际的类型

我不知道你想做什么,但我会看看boost::ptr_vector

特别地,如果你没有正确处理vector成员,它可能会泄漏…(RAII)

vector的复制构造函数应该能够处理它,但由于它是const成员,因此必须在类的构造函数的初始化列表中处理。 编辑:这是错误的…Vector的复制构造函数无法处理它。请参阅David Rodriguez的帖子以获得解释(vector和vector是不相关的类型)。

你在混用

vector<const Foo *>

vector<Foo *>

你必须决定你想要哪一个-没有办法从一个转换到另一个(不做副本)。