const容器返回非const引用

时间:2015-01-18 14:57:36

标签: c++ c++11

这在我的脑海中是有道理的,但我不确定这是否是正确的常识。

我有一个像这样的容器:

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;

2 个答案:

答案 0 :(得分:3)

取决于。

当涉及对象持有的引用时,const正确性变得非常微妙。如果你有一个动态数组类,带有指向当前数组值的指针,从技术上讲你可以在const函数中修改那些指向的值...但你可能不应该这样做,因为这意味着const函数正在改变“动态数组对象”,即使对象本身没有改变。该数组拥有这些值,它们的常量应该由它自己保护。

但是如果你的对象不是指向对象的所有者,那么给它们提供非const引用通常是正确的。在这种情况下,对象的常量仅扩展到映射中对象的标识,而不是它们内部的值。

答案 1 :(得分:2)

通常不会将其视为const - 正确无误。但是,简单的事实是,在这种情况下,该语言并不能真正正确使用const。例如,您不能说std::vector<const T>。即使您修改了IDMap以支持此类用法,它仍然不支持const上的协方差等内容。

您的选择是constconst使用不当的错误选择,所以请选择。

更令人担忧的是_IDSTORAGE_VERSION_MASK。在用户代码中使用_U - 样式名称是未定义的行为。