Приведение указателей к константам в типах контейнеров - PullRequest
0 голосов
/ 22 ноября 2018

C ++ обеспечивает неявное преобразование из T * в const T *.

Если сейчас я использую T * в классе контейнера, как в vector<T *>, то, конечно, неявное преобразование в vector<const T *> больше.

Использование reinterpret_cast, кажется, работает для сотворения всего контейнера, но действительно ли это безопасно сделать?

template <typename T>
const vector<const T *> & constVector(const vector<T *> & vec) {
    return reinterpret_cast<const vector<const T *> &>(vec);
}

// Usage:
vector<int *> vec1;
vector<const int *> vec2 = constVector(vec1);

1 Ответ

0 голосов
/ 22 ноября 2018

но безопасно ли это делать?

Нет, это неопределенное поведение .Использовать reinterpret_cast безопасно только в очень ограниченном наборе сценариев, см. cppreference .


Если право собственности не является проблемой, вы можете использовать (или реализовать) представление const в диапазоне объектов, отличном от const.Поиск в Google для span был бы хорошим началом.std::string_view является примером этого для std::string.

...