Форум программистов, компьютерный форум CyberForum.ru

const_cast для чего и как функционирует - C++

Восстановить пароль Регистрация
 
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
30.08.2013, 20:46     const_cast для чего и как функционирует #1
Дошел в свой книге (Дейтел) до const_cast, не могу понять смысла, т.к. там нагромождено не нужно кода в примере, в 5 раза больше самого примера, вот я сделал свой пример:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
const int var = 10;
 
int *ptr = const_cast<int *>(&var);
 
cout << "*ptr: " << *ptr << " ptr: " << ptr << endl; // 10
cout << "var: " << var << " &var: " << &var << endl; // 10
 
*ptr = 15;
 
cout << "*ptr: " << *ptr << " ptr: " << ptr << endl; // 15
cout << "var: " << var << " &var: " << &var << endl; // 10


var и ptr указывают на одно и тоже значение т.е. имеют один и тот же адрес в памяти, при этом, если обратится к var то оно будет равно 10, а если к *ptr то оно будет равно 15, как так?

Вообще техническая реализация меня не интересует, вопрос, работает ли оно верно? и как я понимаю смысл в этом то и заключается, если вдруг мне надо изменить константное значение при этом что бы оно не менялось (бред по большому счету), то я делаю указатель, использую const_cast и могу указатель меня сколько влезет, а вот само константное значение остается прежним? правильно? или у const_cast более мудреные цели?
И вообще зачем это нужно, ведь проще объявить временную переменную и присвоить ей значение константы и уже крутить эту временную переменную, в чем смысл?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
30.08.2013, 20:58     const_cast для чего и как функционирует #2
Цитата Сообщение от VLK Посмотреть сообщение
Вообще техническая реализация меня не интересует, вопрос, работает ли оно верно?
Работает верно, т.к. 8 строка - попытка изменить значение константы - это UB.

Добавлено через 9 минут
Т.е. с помощью const_cast можно "снять с типа" const\volatile, но тип аргумента от этого никак не измениться.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
30.08.2013, 21:03  [ТС]     const_cast для чего и как функционирует #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Т.е. с помощью const_cast можно "снять с типа" const\volatile, но тип аргумента от этого никак не измениться.
что то я не совсем понимаю, когда есть слово const, это значит что значение изменять нельзя, тут вроде как я const снимаю с помощью const_cast, но при этом все равно не могу менять значение, в чем смысл?

Добавлено через 1 минуту
Для каких целей, а точнее с каком случае применяется const_cast тогда?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
30.08.2013, 21:15     const_cast для чего и как функционирует #4
Цитата Сообщение от VLK Посмотреть сообщение
что то я не совсем понимаю, когда есть слово const, это значит что значение изменять нельзя, тут вроде как я const снимаю, но при этом все равно не могу менять значение, в чем смысл?
Ну я знаю один случай, когда смысл есть: когда есть несостыковки в типизации; например (утрированный пример), тебе надо использовать "левую" ф-ю, которая принимает аргументом char *:
C++
1
size_t count_vowels(char * str);
Ты в принципе знаешь, что строку она не меняет, просто её автор решил, что "const ненужно". Поэтому тебе надо просто получить переменную без const в типе, что бы "обойти" статическую типизацию:
C++
1
2
char const* str = "...";
count_vowels(const_cast<char *>(str));
Из за const_cast str не перестанет быть указателем на константу, и изменять то, на что он указывает (и, соответственно, то, на что указывает результат const_cast), черевато; ты просто как бы говоришь компилятору: "я знаю, что я делаю, не мешай".
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.08.2013, 21:50     const_cast для чего и как функционирует #5
const_cast это средство лечения от кривых библиотек (const-incorrect, выражаясь более толерантно). То есть данные могут не изменяться, но const просто не указан. Абстрактный пример в вакууме:
C++
1
2
3
4
5
6
void log(char *msg) { printf("%s: %s\n", __LINE__, msg); }
 
int main() {
    char[] m = "message";
    log(const_cast<char *>(m);
}
Важно отличать, варианты корректного применения и варианты, приводящие к UB.
C++
1
2
3
int i = 10;
const int *ptr = &i;
*(const_cast<int *>(ptr)) = 11;
ptr константен, но указывает на int, который константным не является, следовательно данный случай корректен. Если же применить const_cast к указателю, который указывает на на самом деле константные данные, то уже UB:
C++
1
2
3
const int i = 10;
const int *ptr = &i;
*(const_cast<int *>(ptr)) = 11;
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
30.08.2013, 22:10     const_cast для чего и как функционирует #6
Цитата Сообщение от fasked Посмотреть сообщение
char[] m
Java forever?
Yandex
Объявления
30.08.2013, 22:10     const_cast для чего и как функционирует
Ответ Создать тему
Опции темы

Текущее время: 04:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru