我想将std::vector<int>
强制转换为const std::vector<const int>
,似乎无法自动强制转换。所以我有一些问题:
我可以轻松地将std::vector<int>
投射到const std::vector<int>
,为什么?
如果我想投射到const std::vecor<cosnt int>
,该怎么办?我已经尝试过const_cast,但是不起作用
答案 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::vector
,std::list
,std::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搜索,以了解其含义以及如何在您的应用程序中正确应用代码,使您的代码更安全,更高效。