const_cast std::vector
const_cast std::vector
我有一个类型为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);
现在obj
和objects
引用同一个对象,但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
但一个更重要的问题是:为什么?如果objects
是const
,则不应该修改它。
您不必在这里进行强制转换,因为您无论如何都是在复制构建内容,并且复制构造函数接受const
引用。
只需说:
std::vector<const Array*> obj = objects;
如果您确定要做什么,下面是如何获得对向量的非常量引用。
const std::vector<const Array*> &objects;
vector<const Array*>& obj = const_cast<std::vector<const Array*>& >(objects);
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 连接和压缩标准::vector<std::字符串的最佳方法>
- C++从 std::vector<std::function<中删除 std::function>>
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 将 std::vector<std::unique_ptr<T>> 移动到 std::vector<std::shared_ptr<T>>
- 如何从 boost::container::vector<std::string>::iterator 访问索引和对象?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 为什么转置这个 std::vector<std::vector<std::string> > 这么慢?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 在 boost::<double>asio::buffer 中使用像 std::vector<std::complex> 这样的参数
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 如何检查 std::vector<std::string> 的元素是否以某个子字符串开头?
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 将 std::vector<std::string> 转换为 const char* const*
- 不能将结构push_back() 转换为 std::vector<std::shared_ptr<theStruct>> theVector
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 将 std::vector<std::p air<const K, V>*> 转换为 std::vector<std::p air<const K, V>&g