2015-01-18 3 views
1

Это имеет смысл в моей голове, но я не уверен, что это правильная константа.Const контейнер, возвращающий неконстантные ссылки

У меня есть контейнер, как это:

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; 
    } 

    // .... 
}; 

я могу делегировать константные ссылки на этот контейнер для других классов хорошо зная, что они не могут изменить контейнер, но они могут получить доступ и изменять его объекты.

Действительно ли это действительный случай? Действительно, как в «Это решает определенную проблему для меня, но я не уверен, что ее хорошая практика»

ответ

2

Обычно это не считается const -correct. Однако простой факт заключается в том, что в этом случае язык не позволяет правильно использовать const. Например, вы не можете сказать std::vector<const T>. Даже если вы исправили свой футляр для поддержки такого использования, он все равно не будет поддерживать такие вещи, как ковариация, на const ness.

Ваш выбор - одно плохое использование const или другое плохое использование const, так что сделайте выбор.

Что еще касается этого _IDSTORAGE_VERSION_MASK. Использование _U - имена стилей в коде пользователя - неопределенное поведение.

+0

Спасибо, не знал этого. – KaiserJohaan

3

Это зависит.

Корректность права становится довольно тонкой, когда дело касается ссылок, хранящихся на объектах. Если у вас есть динамический класс массива с указателем на текущий массив значений, технически вы можете изменить эти значения с указателем в пределах функции const ... но вы, вероятно, не должны, потому что это означает, что функция const изменяется «объект динамического массива», даже если сам объект не изменяется. Массив владеет этими значениями, а их константа должна быть защищена собственными.

Но если ваш объект не является владельцем объектов с заостренными объектами, то, как правило, правильная вещь заключается в выдаче неконстантных ссылок на них. В этом случае константа вашего объекта распространяется только на тождество объектов в сопоставлении, а не на то, какие значения внутри них.

Смежные вопросы