Cast vector в вектор

У меня есть переменная-член типа vector (где T – это пользовательский class, но он также может быть int.) У меня есть функция, из которой я хочу вернуть указатель на этот вектор, но я не хотите, чтобы вызывающий мог изменить вектор или его элементы. Поэтому я хочу, чтобы возвращаемый тип был const vector*

Ни один из методов литья, которые я пытался, работал. Компилятор продолжает жаловаться, что T несовместим с const T.

Вот какой код, который демонстрирует суть того, что я пытаюсь сделать;

 vector a; const vector* b = (const vector* ) (&a); 

Этот код не компилируется для меня.

Заранее спасибо!

Если у вас есть const vector вы не можете изменять контейнер и не можете изменять какой-либо элемент в контейнере. Для достижения этой семантики вам не нужен const vector .

В дополнение к ответу Джеймса о том, как это сделать, вы должны заметить, что const int не является допустимым типом, который помещается в любой стандартный контейнер, поскольку он не может быть назначен.

Почему vector не может быть правильно преобразован в vector даже если T можно преобразовать в const T

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

Если вам разрешено делать vector< const T > &vr = my_vector_of_T , тогда вам будет разрешено добавлять элементы через vr , и эти элементы будут по определению постоянными. Но в то же время те же самые элементы будут my_vector_of_T в my_vector_of_T как неконстантные элементы и могут быть изменены через этот интерфейс, нарушая константу в системе типов.

В частном случае преобразования vector в vector вероятность того, что вы не заметите действительно странные эффекты – помимо добавления элемента к vector и видя, как изменяется постоянный элемент во времени, но все же помните, что, учитывая два родственных типа T1 и T2 для которых существует отношение, в большинстве случаев попытка применить одно и то же отношение к контейнерам T1 и T2 приведет к поломке системы типов.

вы можете принудительно выполнить преобразование следующим образом:

 b = reinterpret_cast*>(&a); 

но я не думаю, что вы должны это сделать, так как это не гарантируется работать, только для компиляции

Компилятор решает заблокировать это. Однако мы знаем, что это безопасно, поэтому, возможно, мы сможем обмануть его:

 const vector* b = (const vector* )(void *)(&a); 
  • постоянные ссылки с typedef и шаблонами в c ++
  • изменение значения переменной const в C ++
  • Использование 'const' для параметров функции
  • Как преобразовать std :: string в const char * или char *?
  • Постоянный указатель vs Указатель на константу
  • В чем разница между константой и readonly?
  • Должен ли компилятор указывать / предупреждать при передаче экземпляров объекта непосредственно в качестве параметров интерфейса const?
  • В чем разница между const_iterator и non-const iterator в C ++ STL?
  • Предупреждения о двойной ошибке указателя в C
  • как работает перегрузка функций const и non-const?
  • C # для обозначения констант?
  • Interesting Posts

    Базовая связь между двумя fragmentами

    Существует ли реализация JSR-303 (проверка боба)?

    Создание туннелей SOCKS с PuTTY и nologin

    Hibernate Slow для получения соединения Postgres

    Могут ли переопределенные методы различаться по типу возврата?

    Каков ваш предпочтительный размер и количество мониторов?

    Можете ли вы перечислить аргументы ключевых слов, получаемые функцией?

    Как отключить поиск в адресной строке Google Chrome?

    Создать простой бутстрап Да / Нет подтверждение или просто уведомление в AngularJS

    JFrame.dispose () vs System.exit ()

    Как измерить скорость передачи данных между моим внутренним жестким диском SATA и внешним USB-накопителем?

    Почему PySpark не может найти py4j.java_gateway?

    Java: Тернар без возврата. (Для вызова метода)

    Как использовать selenium webdriver на локальной (на моем компьютере) веб-странице вместо того, чтобы найти где-нибудь на www?

    Откат драйвера в Windows через командную строку

    Давайте будем гением компьютера.