将vector <t>转换为vector <const t =“”> </const> </t>

时间:2010-05-19 18:54:58

标签: c++ const

我有一个vector<T>类型的成员变量(其中T是一个自定义类,但它也可以是int。) 我有一个函数,我想从中返回一个指向此向量的指针,但我不希望调用者能够更改向量或它的项目。所以我希望返回类型为const vector<const T>*

我试过的任何一种铸造方法都没有。编译器一直抱怨T与const T不兼容。

这里有一些代码,展示了我正在尝试做的事情的要点;

vector<int> a;
const vector<const int>* b = (const vector<const int>* ) (&a);

这段代码不能为我编译。

提前致谢!

5 个答案:

答案 0 :(得分:30)

如果您有const vector<int>,则无法修改容器,也无法修改容器中的任何元素。您不需要const vector<const int>来实现这些语义。

答案 1 :(得分:15)

除了詹姆斯关于如何做到这一点的答案之外,您应该注意const int不是放入任何标准容器的有效类型,因为它不可分配。

答案 2 :(得分:14)

即使vector<T>无法正确转换为vector<const T>,即使T可以转换为const T

这是编程中常见的重复问题,无论是const还是继承(派生对象的容器都不能转换为基础对象的容器,即使包含的元素本身也可以)。问题是逐个元素可以转换元素,但容器本身不能不破坏类型系统。

如果您被允许执行vector< const T > &vr = my_vector_of_T,那么您将被允许通过vr添加元素,并且这些元素将根据定义保持不变。但与此同时,这些相同的元素将作为非const元素在my_vector_of_T中别名,并且可以通过该接口进行修改,从而打破类型系统中的常量。

在将vector<int>转换为vector<const int>的特定情况下,您可能不会注意到真正奇怪的效果 - 无论是向vector<const int>添加元素还是看到如何常量元素随时间变化,但仍然记得给定两个相关类型T1T2存在关系,在大多数情况下尝试将相同的关系应用于容器T1T2将打破类型系统。

答案 3 :(得分:2)

你可以像这样强制转换:

b = reinterpret_cast<const std::vector<const int>*>(&a);

但我不认为你应该这样做,因为它不能保证工作,只能编译

答案 4 :(得分:1)

编译器决定阻止它。但是,我们知道这是安全的,所以也许我们可以欺骗它:

const vector<const int>* b = (const vector<const int>* )(void *)(&a);