powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / const_cast
43 сообщений из 43, показаны все 2 страниц
const_cast
    #40003090
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите вот читаю про const_cast.
написано const_cast позволяет лишить статуса const или volatile переменную .
Но такое ощущение , что не совсем ведь так.

Рассматривать её как полноценную переменную я не могу , то есть так не отработает во всяком случае в Visual Studio(может в других и даст) :
Код: plaintext
1.
2.
3.
	const int i = 0;
	const_cast<int*>(&i);
	i = 555;


а вот так отработает :

Код: plaintext
1.
2.
3.
	const int i = 0;
	int* j = const_cast<int*>(&i);
	*j = 555;



то есть , если мы объявили вот так const int i = 0;, то i можно менять только при помощи указателя ?
...
Рейтинг: 0 / 0
const_cast
    #40003093
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

Убирать const можно только если известно что там не константа, а иначе UB.
...
Рейтинг: 0 / 0
const_cast
    #40003099
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
andron81,

Убирать const можно только если известно что там не константа, а иначе UB.

Код: plaintext
1.
2.
3.
const int i = 0;
    int* j = const_cast<int*>(&i);
    *j = 555;



а вот это UB ?
...
Рейтинг: 0 / 0
const_cast
    #40003105
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
andron81,

Убирать const можно только если известно что там не константа, а иначе UB.


полное задание следующее :

"создайте const-массив double и volatile массив double. Переберите все элементы каждого массива в цикле, при помощи оператора const_cast отмените для каждого элемента const и volatile и присвойте ему значение"

некорректно поставленная задача , как вы считаете ?
...
Рейтинг: 0 / 0
const_cast
    #40003106
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81некорректно поставленная задача , как вы считаете ?

Ещё одна типично бессмысленная учебная задача для того чтобы студент запомнил синтаксис
const_cast. Корректности от неё никто бы и не ожидал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
const_cast
    #40003109
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
ясно, спасибо.
можно закрывать
...
Рейтинг: 0 / 0
const_cast
    #40003117
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81

некорректно поставленная задача , как вы считаете ?

Обычная учебная задача.
...
Рейтинг: 0 / 0
const_cast
    #40003119
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
удалил
...
Рейтинг: 0 / 0
const_cast
    #40003120
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
andron81

некорректно поставленная задача , как вы считаете ?

Обычная учебная задача.



вот если бы они просили бы сделать вначале "переменный" массив (не констатный) потом сделать из него констатный и снова переменный и набить значениями вот тогда наверно всё было бы четко.

и как ты бы решал это задание ? забил бы на UB ? (решать не надо , просто ответь на вопрос)
...
Рейтинг: 0 / 0
const_cast
    #40003123
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81

и как ты бы решал это задание ? забил бы на UB ? (решать не надо , просто ответь на вопрос)

Где UB? Вот вам стартовый массив, начните с него и решайте задачу.
Код: plaintext
1.
double const arr[3] = { 1.1, 2.2, 3.3 };
...
Рейтинг: 0 / 0
const_cast
    #40003125
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Где UB?

UB - при попытке модифицировать конст объект через const_cast.
Это прямо в стандарте описано.
...
Рейтинг: 0 / 0
const_cast
    #40003127
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
petrav
Где UB?

UB - при попытке модифицировать конст объект через const_cast.
Это прямо в стандарте описано.

Ааа... я об этом не подумал. Ну тогда ТС можно начать с этого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
void doWork(double const (&arr)[3])
{
    // Больше нет УБ.
}

main()
{
    double arr[3] = { 1.1, 2.2, 3.3 };
    doWork(arr);
}
...
Рейтинг: 0 / 0
const_cast
    #40003132
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Anatoly Moskovsky
пропущено...

UB - при попытке модифицировать конст объект через const_cast.
Это прямо в стандарте описано.

Ааа... я об этом не подумал. Ну тогда ТС можно начать с этого:

Код: plaintext
1.
    double arr[3] = { 1.1, 2.2, 3.3 };





это чо ? я задание вроде бы пропечатывал дословно.
...
Рейтинг: 0 / 0
const_cast
    #40003133
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
petrav
пропущено...

Ааа... я об этом не подумал. Ну тогда ТС можно начать с этого:

Код: plaintext
1.
    double arr[3] = { 1.1, 2.2, 3.3 };





это чо ? я задание вроде бы пропечатывал дословно.

А что не нравится то? Что массив создаётся не const? Ну там же УБ. Ну сделайте так:
Код: plaintext
1.
double const *const arr = new double const[3]();


Тут я думаю UB не может возникнуть, а объект константный.
...
Рейтинг: 0 / 0
const_cast
    #40003135
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
andron81
пропущено...


это чо ? я задание вроде бы пропечатывал дословно.

А что не нравится то? Что массив создаётся не const? Ну там же УБ. Ну сделайте так:
Код: plaintext
1.
double const *const arr = new double const[3]();


Тут я думаю UB не может возникнуть, а объект константный.


да , не нравится. это уже троллинг ! так и напиши , что это УБ исходя из условия. а то мало того , что ты не понял задание и тебе старожилу этого клуба разживали причем в более понятной форме чем мне новичку, и ты дальше выпендриваешься.
...
Рейтинг: 0 / 0
const_cast
    #40003143
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

Вы бы вместо того что бы истерить, лучше бы поинтересовались почему там может возникнуть UB?
Это нетривиальный вопрос.

PS: Какие люди нервные.
...
Рейтинг: 0 / 0
const_cast
    #40003230
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Скажите вот читаю про const_cast.
написано const_cast позволяет лишить статуса const или volatile переменную .
Но такое ощущение , что не совсем ведь так.

Рассматривать её как полноценную переменную я не могу , то есть так не отработает во всяком случае в Visual Studio(может в других и даст) :
Код: plaintext
1.
2.
3.
	const int i = 0;
	const_cast<int*>(&i);
	i = 555;

Компилятор мысли читать не умеет и не понимает, что ты пытаешься тут сделать. По ходу, у тебя беда с пониманием жизни, как таковой, не говоря уже о программировании. В программировании, как и в жизни, есть объект (glvalue), субъект (rvalue) и действие. Соответственно, строка "const_cast<int*>(&i);" в твоей попытке не несёт абсолютно никакой смысловой нагрузки.
Попробуй это:
Код: plaintext
1.
2.
3.
4.
5.
  const int i = 123;
  int & j = *const_cast<int*>(&i);
  printf("\r\n%i", i);
  j = 555;
  printf("\r\n%i", j);
...
Рейтинг: 0 / 0
const_cast
    #40003248
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
andron81,

Убирать const можно только если известно что там не константа, а иначе UB.
Например?
...
Рейтинг: 0 / 0
const_cast
    #40003261
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
Например?


Код: plaintext
1.
2.
3.
4.
5.
  const int i = 123;
  int & j = *const_cast<int*>(&i);
  printf("\r\n%i", i);
  j = 555; // UB
  printf("\r\n%i", j);
...
Рейтинг: 0 / 0
const_cast
    #40003267
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, можно ссылку на пункт стандарта, по которому это UB?
...
Рейтинг: 0 / 0
const_cast
    #40003280
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
Anatoly Moskovsky, можно ссылку на пункт стандарта, по которому это UB?

Интереснее почему там UB? Переменной i не существует, а мы от неё адрес взяли и писали туда?
...
Рейтинг: 0 / 0
const_cast
    #40003282
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav, там есть "переменная", которая помечена что она const, но это не значит что она константна по своей сути и находится на защищённой от записи странице памяти.
...
Рейтинг: 0 / 0
const_cast
    #40003286
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
Anatoly Moskovsky, можно ссылку на пункт стандарта, по которому это UB?


c++20 9.2.8.1 The cv-qualifiers
Any attempt to modify (7.6.19, 7.6.1.5, 7.6.2.2) a const object (6.8.3) during its lifetime (6.7.3) results in
undefined behavior.
...
Рейтинг: 0 / 0
const_cast
    #40003311
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, впервые слышу, чтобы объект на стеке нельзя было менять, даже если он декларирован с квалификатором const.
Ну да ладно, пусть так - UB... Тем не менее, в следующем примере никакого UB нет:
Код: plaintext
1.
2.
3.
4.
5.
  const int & i = *new int (123);
  printf("\r\n%i", i);
  int & j = *const_cast<int*>(&i);
  j = 555;
  printf("\r\n%i", j);
...
Рейтинг: 0 / 0
const_cast
    #40003328
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_dev
Тем не менее, в следующем примере никакого UB нет
По запаху UB определяешь?
rdb_dev
Код: plaintext
1.
2.
3.
4.
5.
  const int & i = *new int (123);
  printf("\r\n%i", i);
  int & j = *const_cast<int*>(&i);
  j = 555;
  printf("\r\n%i", j);

Вангую, подразумевалось
Код: plaintext
1.
2.
  j = 555;
  printf("\r\n%i", i);
...
Рейтинг: 0 / 0
const_cast
    #40003357
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devобъект на стеке

А с чего ты взял, что он на стеке?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
const_cast
    #40003368
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
впервые слышу, чтобы объект на стеке нельзя было менять, даже если он декларирован с квалификатором const.

Никто не говорит что нельзя. Можно. Только результат - UB.
Например на одной платформе результат будет успешной модификацией, на другой - успешно, но остальной код будет видеть старое значение, а на третьей будет segfault.
Это я описал вполне реальные платформы.
Поэтому в стандарте просто записали UB чтобы не привязываться к платформе.
...
Рейтинг: 0 / 0
const_cast
    #40003377
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest
rdb_dev
Тем не менее, в следующем примере никакого UB нет
По запаху UB определяешь?
rdb_dev
Код: plaintext
1.
2.
3.
4.
5.
  const int & i = *new int (123);
  printf("\r\n%i", i);
  int & j = *const_cast<int*>(&i);
  j = 555;
  printf("\r\n%i", j);

Определяю по конкретному поведению компилятора под конкретную платформу.

3 A pointer or reference to a cv-qualified type need not actually point or refer to a cv-qualified object, but it is treated as if it does; a const-qualified access path cannot be used to modify an object even if the object referenced is a non-const object and can be modified through some other access path. [ Note: Cv-qualifiers are supported by the type system so that they cannot be subverted without casting. — end note ]

4 Except that any class member declared mutable can be modified, any attempt to modify a const object during its lifetime results in undefined behavior. [ Example:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
const int ci = 3;                       // cv-qualified (initialized as required)
ci = 4;                                 // ill-formed: attempt to modify const

int i = 2;                              // not cv-qualified
const int* cip;                         // pointer to const int
cip = &i;                               // OK: cv-qualified access path to unqualified
*cip = 4;                               // ill-formed: attempt to modify through ptr to const

int* ip;
ip = const_cast<int*>(cip);             // cast needed to convert const int* to int*
*ip = 4;                                // defined: *ip points to i, a non-const object

const int* ciq = new const int (3);     // initialized as required
int* iq = const_cast<int*>(ciq);        // cast required
*iq = 4;                                // undefined: modifies a const object


a guest
Вангую, подразумевалось
Код: plaintext
1.
2.
  j = 555;
  printf("\r\n%i", i);

В данном случае нет никакой разницы что там будет "i" или "j".
...
Рейтинг: 0 / 0
const_cast
    #40003384
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
rdb_dev
впервые слышу, чтобы объект на стеке нельзя было менять, даже если он декларирован с квалификатором const.
Никто не говорит что нельзя. Можно. Только результат - UB.
UB это не результат, а платформо и компиляторо зависимое поведение. Если ты точно знаешь, к какому результату приведёт компиляция того или иного фрагмента, определяемого по стандарту как UB, тебе остаётся лишь экранировать свои фрагменты в условных директивах компилятора, но так как ты вряд ли знаешь как ведут себя все компиляторы на всевозможных существующих и будущих платформах, в общем случае для них поведение таких фрагментов будет неопределено.
...
Рейтинг: 0 / 0
const_cast
    #40003387
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

rdb_devобъект на стеке
А с чего ты взял, что он на стеке?Твоя правда!
По фрагменту в топикстарте нельзя сказать, что объект будет создан именно на стеке.
...
Рейтинг: 0 / 0
const_cast
    #40003391
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
По фрагменту в топикстарте нельзя сказать, что объект будет создан именно на стеке.
Стек - это ж вообще детали реализации. В стандарте с++ про стек же ничего не написано?
...
Рейтинг: 0 / 0
const_cast
    #40003394
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb, да!
Равно как и "куча"... Но я никогда не встречал реализацию разных куч для const и не_const объектов, так, чтобы менеджер кучи создавал копию страницы памяти, на которой выделяется место для нового константного объекта, инициализировал этот объект, затем ставил на страницу защиту от записи и подменял старую страницу виртуальной памяти на новую. Как правило, используется одна единственная куча для всего.
...
Рейтинг: 0 / 0
const_cast
    #40003437
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
Но я никогда не встречал реализацию разных куч для const и не_const объектов

В С++20 объекты кучи вообще могут полностью инлайниться на этапе компиляции с помощью constexpr.
Например можно работать со строками и векторами полностью в компайл тайм.
И в этом смысле такие объекты создаются в другой куче, которой нет в рантайме.
...
Рейтинг: 0 / 0
const_cast
    #40003441
цитирую Herb Sutter:
автор1.don't use reinterpret_cast;
2.don't use static_cast downcasts. Use dynamic_cast instead;
3.don't use const_cast to cast away const (i.e. at all);
4.don't use C-style (T)expression casts that would perform a reinterpret_cast, static_cast downcast or const_cast.
YouTube Video
...
Рейтинг: 0 / 0
const_cast
    #40003459
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
В С++20 объекты кучи вообще могут полностью инлайниться на этапе компиляции с помощью constexpr.
Чего угодно, только не "кучи". Для создания на куче используется new.
...
Рейтинг: 0 / 0
const_cast
    #40003468
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devДля создания на куче используется new.

Это как-то мешает его обработке в compile-time?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
const_cast
    #40003511
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
Чего угодно, только не "кучи". Для создания на куче используется new.

Так я вам и говорю - в C++20 добавили поддержку constexpr new.
...
Рейтинг: 0 / 0
const_cast
    #40003624
а как много промышленным кодерам удаётся туда засунуть? (в этап компиляции)
...
Рейтинг: 0 / 0
const_cast
    #40003731
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
2.don't use static_cast downcasts. Use dynamic_cast instead;
А оно же вроде ругается на момент компиляции? Ну и, кстати, говорят, что dynamic_cast тормозной, так что тоже don't use dynamic_cast instead of dynamic_cast

автор
3.don't use const_cast to cast away const (i.e. at all);
А вот тут академический интерес, у кого когда возникает такая ситуация, что надо const выкастить? У меня это обычно архитектурная ошибка, когда я вернул const-ссылку на какой-то внутренний объект, у которого пытаюсь звать не-const метод. Тогда я сажусь и думаю, почему так получилось, и в ~80% случаев я переношу вызов этого не-const метода внутрь класса хозяина, а в ~20% я пишу второй не-const getter. И я всегда по умолчанию объявляю const-ссылки на объекты, когда их выпрашиваю.
автор
4.don't use C-style (T)expression casts
Вот тут согласен, но что если я переопределяю operator(T)? Или так лучше не делать тоже?
...
Рейтинг: 0 / 0
const_cast
    #40003736
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CEMb,


Я припоминаю убирал const, в связи с чужими функциями возвращающими const, или желающими указатель на const в параметрах.

strstr(), strtol() - примеры таковых.
...
Рейтинг: 0 / 0
const_cast
    #40003778
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb
автор
3.don't use const_cast to cast away const (i.e. at all);
А вот тут академический интерес, у кого когда возникает такая ситуация, что надо const выкастить?
До C++11 в реализации perfect forwarding через конструктор копии экземпляра какого-нибудь вложенного public/private класса и чтобы результат, в конечном счёте, автоматом приводился к инкапсулирующему классу, а для объекта исключения можно даже без вложенных классов обойтись и сразу реализовывать конструктор копии как конструктор перемещения.
...
Рейтинг: 0 / 0
const_cast
    #40003780
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
rdb_devДля создания на куче используется new.
Это как-то мешает его обработке в compile-time?Пока не знаю, но подозреваю, что к менеджеру кучи, как таковому, это не имеет никакого отношения.
...
Рейтинг: 0 / 0
const_cast
    #40003782
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
rdb_dev
Чего угодно, только не "кучи". Для создания на куче используется new.
Так я вам и говорю - в C++20 добавили поддержку constexpr new.
И вы уже знаете как это работает и в каких случаях применяется? Или же просто дайджест посмотрели?

P.S. Предлагаю на "ты".
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / const_cast
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]