C ++如何将std :: vector <int>转换为const std :: vector <const int =“”>?

时间:2018-07-31 20:21:35

标签: c++

我想将std::vector<int>强制转换为const std::vector<const int>,似乎无法自动强制转换。所以我有一些问题:

  1. 我可以轻松地将std::vector<int>投射到const std::vector<int>,为什么?

  2. 如果我想投射到const std::vecor<cosnt int>,该怎么办?我已经尝试过const_cast,但是不起作用

1 个答案:

答案 0 :(得分:4)

  

如果我想投射到const std::vecor<cosnt int>,该怎么做?我已经尝试过const_cast,但没有用

简短的回答:不要。

std::vector<int>中创建const std::vector<int>常量时,内容本身也隐式变为const。换句话说,如果您编写这样的内容,将无法修改元素:

const std::vector<int> values{1,2,3,4,5};

//Nope
//values.emplace_back(6);

//Also Nope
//values[3] = 5;

//Still nope
//values.erase(values.begin() + 1, values.begin() + 3);

//Nuh-uh
//std::vector<int> & mutable_values = values;

//This, however, is okay.
std::vector<int> const& immutable_values = values;

//Same restrictions though
//immutable_values[2] = 6;
//immutable_values.emplace_back(7);

//This is fine
std::vector<int> copy_of_values = values;

//But that's because you made a copy
copy_of_values.emplace_back(6);
assert(copy_of_values.size() != values.size());
assert(copy_of_values != values);

这就是为什么std::vectorstd::liststd::map等STL容器禁止在其模板参数列表中使用const成员的原因:容器本身const也会使其内容const,这是这些容器设计的明示合同。一些“容器”不具有此属性,例如“智能指针”,这就是为什么有时您会看到类似以下内容的原因:

std::shared_ptr<int> ptr = std::make_shared<int>(42);
std::shared_ptr<const int> non_modifying_ptr = ptr;

这是引用计数指针的核心功能的一部分。

顺便说一句,这是确保您的代码“常量正确”的全部内容,我强烈建议您在该主题上进行Google搜索,以了解其含义以及如何在您的应用程序中正确应用代码,使您的代码更安全,更高效。