Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

Изменение константного объекта с применением const_cast

27.03.2017, 23:29. Показов 4396. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1.
Это код из учебника С. Прата "Лекции и упражнения".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
void change(const int* pt, int n){
    int *pc;
    pc = const_cast<int*>(pt);
    *pc+=n;
}
 
int main(){
    int pop1 = 38383;
    const int pop2 = 2000;
    cout << "pop1, pop2: " << pop1 << ',' << pop2 << '\n';
    change(&pop1,-103);
    change(&pop2,-103); //<-- зрительно здесь идёт попытка изменить константу
 
    cout << "pop1, pop2: " << pop1 << ',' << pop2 << '\n';
}
Этот код похож на UB с той точки зрения, что происходит попытка изменения cv-переменной.
Он UB?

Если не UB, то нужно объяснение.

2.
Может кто-нибудь дать пример, когда const_cast добавляет квалификатор const?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.03.2017, 23:29
Ответы с готовыми решениями:

Инициализация константного статического объекта - члена класса
Здравствуйте, у меня возникла проблема с инициализацией статического объекта, который является членом класса. Этот объект должен быть...

Ошибка при обращении к методу константного объекта
Есть некий класс, в нем есть метод const size_t Length(); пишу оператор сложения Class&amp; operator + (const Class&amp; Val) { if...

Изменение константного поля класса
Является ли изменение константы-поля класса UB? - компилятор может закэшировать значение и не ждать, что оно другое. - с другой стороны...

24
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.03.2017, 16:36
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от daslex Посмотреть сообщение
Это-то понятно. Снимает - не снимает, каждый понимает немного по-своему. Константный член класса - такой же константный, как и любой константный вне класса. Да и грань между аннулирует, уничтожает, снимает какая-то слишком тонкая, рвётся. Вот это непонятно.
mutable уточняет:
ведь объект может быть константным,
кроме вот этой вот фигни.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
28.03.2017, 16:41  [ТС]
Так и сам const уточняет, что объект должен быть таким-то, а не делает его константным.
Это же не мешает никому говорить, что const делает объект константным, хотя в действительности не делает, а только указывает.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.03.2017, 16:57
Цитата Сообщение от daslex Посмотреть сообщение
Так и сам const уточняет, что объект должен быть таким-то, а не делает его константным.
Это же не мешает никому говорить, что const делает объект константным, хотя в действительности не делает, а только указывает.
суть идеи:
иметь возможность сообщить компилятору,
что вот этот чертов объект будет константным,
но при этом что бы была возможность уточнить:
вот кроме вот этих вот данных-членов.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
28.03.2017, 17:09  [ТС]
Я знаю, зачем это нужно.
Я не знаю, зачем Nosey сюда о mutable написал, я не спрашивал.

Просто в теме из-за его сообщения появилась появилась предпосылка одно и то же называть разными понятиями.
И я понимаю, и Nosey понимает, и Кросмах понимает, и Вы понимаете, что есть mutable в целом, - но будем мусолить, что ли?

Я думаю, что оговариваемое в этом контексте допущение, говорение о снятии константности, вполне нормальное допущение. Причину этому чуть ранее я озвучил.
1
28.03.2017, 17:40

Не по теме:

Цитата Сообщение от daslex Посмотреть сообщение
говорение о снятии константности, вполне нормальное допущение.
И более того, я заморочился и поискал откуда у меня в голове такая картина мира и есть ли хоть какие-то предпосылки к её верности. Или это лютая отсебятина была :-[

Ну собственно вот:
Expressions : Class member access :
....
Otherwise, one of the following rules applies.
....
If E2 is a non-static data member and the type of E1 is “cq1 vq1 X”, and the type of E2 is “cq2 vq2 T”, the expression designates the named member of the object designated by the first expression. If E1 is an lvalue, then E1.E2 is an lvalue; otherwise E1.E2 is an xvalue. Let the notation vq12 stand for the “union” of vq1 and vq2; that is, if vq1 or vq2 is volatile, then vq12 is volatile. Similarly, let the notation cq12 stand for the “union” of cq1 and cq2; that is, if cq1 or cq2 is const, then cq12 is const. If E2 is declared to be a mutable member, then the type of E1.E2 is “vq12 T”. If E2 is not declared to be a mutable member, then the type of E1.E2 is “cq12 vq12 T”.
Т.е. ну пару натяжек, и можно говорить что константность отбрасывается даже по стандарту :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.03.2017, 17:40

Беру и спокойно вызываю неконстантную функцию для константного объекта
Это как ? Везде пишут, что сие невозможно в принципе. Или есть исключение для конструктора ? #include &lt;iostream&gt; using...

Изменение кода с применением классов
Используя код (ниже) преобразовать с применением классов let vehicle = { hasWheels: true, speed: 10, }; let train = { ...

Изменение формы таблицы с применением комплексной формулы
Доброго времени суток, форумчане. Попытался, как сознательный пользователь, воспользоваться сначала поиском, но это не принесло...

Изменение последнего значения идентификатора с применением хранимых процедур
Здравствуйте. Существует программа без исходника. Она работает с Mssql server. Методом анализа и тыка было выяснено идентификатор для новой...

const_cast(*this)
Пусть есть некий class Foo { ... }; std::wostream&amp; operator&lt;&lt; (std::wostream &amp;out, Foo &amp;obj) { // ... very-very many...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru