【发布时间】:2015-03-15 21:33:33
【问题描述】:
我有以下代码:
#include <map>
using namespace std;
struct A {};
map</*const*/ A *, int> data;
int get_attached_value(const A *p) {
return data.at(p);
}
void reset_all() {
for (const auto &p : data) *p.first = A();
}
我的问题是,当我注释和取消注释 data 类型的 const 时,此代码因类型错误而失败。有什么办法可以在不使用const_cast 并且不丢失get_attached_value 中的const 的情况下解决这个问题?
【问题讨论】:
-
您不能(重要!)更改 std::map/std::set 键。绝不。它会破坏 std::map/std::set 的内部数据结构,并可能导致巨大的内存泄漏/段错误/内存损坏/等。永远不要那样做。从来没有。
-
是的,你可以让
get_attached_value接受A *。 -
@nabijaczleweli 请注意,OP 没有 更改密钥。关键是指针。他们只是改变了该指针指向的对象。
-
@Angew 我看到了您的(有效)观点,但取决于实现和/或其他模板参数,这可能会中断。
-
恕我直言,您应该使用
get_attached_value中的const_cast解决方案。 您作为该函数的实现者知道指针不会被修改,因此在那里使用const_cast是安全的。
标签: c++ types casting stl constants