将vector <T>转换为vector <const T>

use*_*386 29 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);
Run Code Online (Sandbox Code Playgroud)

这段代码不能为我编译.

提前致谢!

Jam*_*lis 30

如果你有一个const vector<int>你不能修改容器,也不能修改容器中的任何元素.您不需要a const vector<const int>来实现这些语义.

  • 但是如果我有vector <const string>怎么办?大多数时候创建这样的向量是有道理的. (3认同)

Edw*_*nge 15

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


Dav*_*eas 14

关于为什么一个vector<T>无法正确转换为vector<const T>即使T可以转换为const T

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

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

在一个特定的情况下,vector<int>被转换为一个vector<const int>,有机会,你不会注意到非常奇怪的效果--besides添加元素的vector<const int>,看怎么的时间因素的变化,但仍然记得,给出了两个相关类型T1T2为其一个关系存在,在大多数情况下,试图适用于容器同样的关系T1,并T2会破坏类型系统.