C ++ - 返回const对象的const向量的const向量

时间:2011-07-18 17:40:01

标签: c++ stl const

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

vector< vector<Foo*> > mFooVectors;

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

const vector<const Foo*>&         getFoos(int index); 

所以我创建了一个向量的const声明:

const vector< const vector<const Foo*> > mConstFooVectors;

现在我该怎么做mConstFooVectors = mFooVectors所以我可以返回对mConstFooVectors的引用?

4 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:1)

我不知道你要做什么,但我要看一下boost :: ptr_vector

特别是,如果你没有正确处理它,你的矢量成员可能会泄漏......(RAII)

答案 2 :(得分:0)

vector的复制构造函数应该能够处理它,但是你必须在类的构造函数的初始化列表中执行它,因为它是一个const成员。

编辑:那是错的... Vector的复制构造函数无法处理它。请参阅David Rodriguez的帖子以获得解释(向量和向量是不相关的类型)。

答案 3 :(得分:0)

你正在混合

vector<const Foo *>

vector<Foo *>

你必须决定你想要哪一个 - 没有办法从一个转换到另一个(没有复制)。