我有一个vector<T>
类型的成员变量(其中T是一个自定义类,但它也可以是int。)
我有一个函数,我想从中返回一个指向此向量的指针,但我不希望调用者能够更改向量或它的项目。所以我希望返回类型为const vector<const T>*
我试过的任何一种铸造方法都没有。编译器一直抱怨T与const T不兼容。
这里有一些代码,展示了我正在尝试做的事情的要点;
vector<int> a;
const vector<const int>* b = (const vector<const int>* ) (&a);
这段代码不能为我编译。
提前致谢!
答案 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>
添加元素还是看到如何常量元素随时间变化,但仍然记得给定两个相关类型T1
和T2
存在关系,在大多数情况下尝试将相同的关系应用于容器T1
和T2
将打破类型系统。
答案 3 :(得分:2)
你可以像这样强制转换:
b = reinterpret_cast<const std::vector<const int>*>(&a);
但我不认为你应该这样做,因为它不能保证工作,只能编译
答案 4 :(得分:1)
编译器决定阻止它。但是,我们知道这是安全的,所以也许我们可以欺骗它:
const vector<const int>* b = (const vector<const int>* )(void *)(&a);