是否可以将对std :: list <int *>的引用转换为对std :: list <const int * =“”>的引用?

时间:2015-06-02 16:22:39

标签: c++ stl const

是否可以将对jQuery的引用转换为对std::list<int*>的引用?

直接静态演员失败。

我遇到的问题是对象实例维护一个int *,和的列表 此列表可以通过引用返回:

std::list<const int*>

拥有getList()函数的const版本会很好 看起来像:

std::list<int*>  &A::getList() { return theList; }

即int是const的,并且能够在不保留的情况下执行此操作 两个清单。

2 个答案:

答案 0 :(得分:2)

对于编译器,list<int*>list<const int*>是两种完全不相关的类型,与list<Foo>list<Bar>相同。即使FooBar相关,list<Foo>list<Bar>之间也没有任何关系。

如果您想从list<const int*>函数返回,则需要从原始list<int*>构建自己的其他const。无法进行直接演员/转换。

编辑您可以查看propagate_const包装器提案,该提案还允许您将const传播到数据。在这种情况下,您只需使用list<propagate_const<int*>>定义列表,在const函数中,您只需返回一个const引用const list<propagate_const<int*>>&即可。指向的数据都是const

答案 1 :(得分:0)

没有。它会(隐含地)违反const安全。

通过const引用添加const值可以通过非const引用进行修改。

下面:

std::list<int*> mod;
std::list<const int*>& nomod=magic_cast<std::list<const int*>>(mod);
const int x=19;

nomod.push_back(&x);
(*mod.first())++; //Oh dear!

magic_cast是某个运营商执行您正在寻找的内容。

请注意,您已从x隐式删除了const。