О том, почему vector<T>
нельзя правильно преобразовать в vector<const T>
, даже если T
можно преобразовать в const T
Это распространенная повторяющаяся проблема в программировании, будь то с константностью или наследованием (контейнер производного объекта не может быть преобразован в контейнер базовых объектов, даже если сами содержащиеся элементы могут). Проблема в том, что элемент за элементом каждый из них может быть преобразован, но сам контейнер не может не нарушить систему типов.
Если бы вам было разрешено сделать vector< const T > &vr = my_vector_of_T
, то вам было бы разрешено добавлять элементы через vr
, и эти элементы были бы постоянными по определению. Но в то же время те же самые элементы будут псевдонимами в my_vector_of_T
как неконстантные элементы и могут быть изменены через этот интерфейс, нарушая константность в системе типов.
В частном случае vector<int>
, конвертируемого в vector<const int>
, есть вероятность, что вы не заметите действительно странных эффектов - кроме добавления элемента к vector<const int>
и наблюдения за тем, как константа элемент изменяется во времени, но все же помните, что с учетом двух связанных типов T1
и T2
, для которых существует отношение, в большинстве случаев попытка применить такое же отношение к контейнерам T1
и T2
приведет к разрыву система типов.