const_cast std :: vector

时间:2012-08-22 16:12:23

标签: c++ const-cast

我有一个类型为const std::vector<const Array*> &objects的向量,它作为参数传递给方法。

我想要const_cast,但由于某些原因我不能这样做。我试过了:

vector<const Array*> obj = const_cast<const std::vector<const Array*> >(objects);

和其他一些方式,但它一直在抱怨。

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

首先,不要。更改函数的签名以获取非const引用,您可以通过执行此操作冒险UB:

const std::vector<const Array*> myData = /* fill */;
yourFunction(myData); // try to modify my stuff and you get UB!

现在,如果您仍然相信,无论出于何种原因(例如遗留API),您都必须这样做:

vector<const Array*>& obj = const_cast<std::vector<const Array*>&>(objects);

现在objobjects引用相同的对象,但obj不是const限定的。在这一点上,一切都是明确的;它只修改了一个符合UB的const 对象,所以要小心。

答案 1 :(得分:1)

  

我需要将它传递给需要迭代它的函数(它不做任何修改)

使用const_iterator

您想将const std::vector<const Array*>投射到const std::vector<const Array*>?他们不是一样的。如果要删除const:

std::vector<const Array*> obj = const_cast<std::vector<const Array*> >(objects);
//                                         |
//                                      no const

但更重要的问题是:为什么?如果objectsconst,则不应修改它。

答案 2 :(得分:1)

您不必在此处进行转换,因为您无论如何都是复制构造内容,并且复制构造函数接受const引用。

请说:

std::vector<const Array*> obj = objects;

答案 3 :(得分:1)

如果你确定要做什么,这里是如何获得向量的非const引用。

const std::vector<const Array*> &objects;

vector<const Array*>& obj = const_cast<std::vector<const Array*>& >(objects);