Присваивает ли одно и то же значение константной переменной UB в C ++? - PullRequest
0 голосов
/ 21 января 2019

С учетом следующего кода C ++:

#include <iostream>

int main()
{
    const int i = 1;
    *const_cast<int*>(&i) = 1; // Not allowed but doesn't do anything?
    std::cout << i << "\n";
}

Вопрос : Вызывает ли приведенный выше код UB (неопределенное поведение)? Я знаю, что отбрасывание const и присвоение нового значения i приводит к UB, так как нам не разрешено изменять значение переменной const. Однако в приведенном выше коде я на самом деле не изменил значение i - так что это все еще будет UB?

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Вопрос: Вышеприведенный код вызывает UB (неопределенное поведение)?

Да.

Однако в приведенном выше коде я не сделалфактически измените значение i

Это точно , что вы сделали, когда вы присваивали результат косвенного обращения через указатель, который указывал на i.

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

0 голосов
/ 21 января 2019

const_cast - для случаев, когда у вас есть постоянная ссылка на переменную, которая не const. По сути, это способ обмана, если вы знаете , что ссылаетесь на неконстантный объект. Я думаю, что «хороший» (честно говоря, я никогда не думаю, что это на самом деле хороший) пример const_cast предназначен для случаев, когда у вас есть внутренняя структура, которая обычно модифицирует себя, но представляет себя как const при доступе извне (способ сделать вещи доступными только для чтения извне).

Если вы попытаетесь изменить фактические данные, объявленные как const, то они не определены, и в зависимости от того, на какой системе вы работаете, изменится ошибка. Некоторые среды могут вызывать segfault, другие ничего не будут делать (постоянная память с игнорируемыми записями), а некоторые могут изменить данные в любом случае (например, если данные программы полностью загружены в обычную, доступную для записи память).

0 голосов
/ 21 января 2019

Да.Это все еще UB.

Попытка изменить переменную const - это UB, а не просто присвоение нового значения.

Из N4296, Раздел 1.9,Пункт 4:

Некоторые другие операции описаны в этом международном стандарте как неопределенные (например, эффект попытки изменить объект const).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...