这在我的脑海中是有道理的,但我不确定这是否是正确的常识。
我有一个像这样的容器:
template<typename T>
class IDMap
{
public:
typedef uint64_t ItemID;
T& GetItem(const ItemID id) const
{
const uint32_t index = _IDSTORAGE_INDEX_MASK(id);
const uint32_t version = _IDSTORAGE_VERSION_MASK(id);
assert(mItems[index].mVersion == version);
return mItems[index].mItem;
}
// ....
};
我可以将对这个容器的const引用委托给其他类,知道他们无法修改容器,但是他们可以访问和修改它的对象。
这是一个有效的案例吗?在&#34中有效;这为我解决了一个特定的问题,但我不确定它的良好做法&#34;
答案 0 :(得分:3)
取决于。
当涉及对象持有的引用时,const正确性变得非常微妙。如果你有一个动态数组类,带有指向当前数组值的指针,从技术上讲你可以在const函数中修改那些指向的值...但你可能不应该这样做,因为这意味着const函数正在改变“动态数组对象”,即使对象本身没有改变。该数组拥有这些值,它们的常量应该由它自己保护。
但是如果你的对象不是指向对象的所有者,那么给它们提供非const引用通常是正确的。在这种情况下,对象的常量仅扩展到映射中对象的标识,而不是它们内部的值。
答案 1 :(得分:2)
通常不会将其视为const
- 正确无误。但是,简单的事实是,在这种情况下,该语言并不能真正正确使用const
。例如,您不能说std::vector<const T>
。即使您修改了IDMap以支持此类用法,它仍然不支持const
上的协方差等内容。
您的选择是const
或const
使用不当的错误选择,所以请选择。
更令人担忧的是_IDSTORAGE_VERSION_MASK
。在用户代码中使用_U
- 样式名称是未定义的行为。