const_cast std::vector

const_cast std::vector

本文关键字:vector std cast const      更新时间:2023-10-16

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

我想const_cast,但由于某种原因我做不到。我试过:

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

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

有什么想法吗?

首先,不要。将函数的签名更改为非常量引用,这样做会给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_iterator

要将const std::vector<const Array*>强制转换为const std::vector<const Array*>吗?他们不是一模一样吗。如果你想删除常量:

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

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

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

只需说:

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

如果您确定要做什么,下面是如何获得对向量的非常量引用。

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