Стандарт C ++ 17 - Отбрасывание констант статического - PullRequest
0 голосов
/ 18 февраля 2019

Недавно я решил погрузиться в стандарт C ++ и проверить, правильно ли определены определенные фрагменты кода и где найти эти определения в стандарте.Поскольку стандарт довольно сложно понять правильно (особенно если вы к нему не привыкли), я хотел проверить, правильно ли мое предположение.

Я наткнулся на следующий пример (что, очевидно, является плохой идеей).Он прекрасно компилируется (с использованием g ++ 8.2.1), но SEGFAULT во время выполнения:

#include <iostream>

static const int staticInt = 23;

int main () {
    int &localInt = const_cast<int &>(staticInt);
    localInt = 11;
    std::cout << staticInt << std::endl;
    return 0;
}

Итак, я искал через стандарт (я использую рабочий проект на open-std btw)и нашел параграф 6.8.10:

Создание нового объекта в хранилище, которое занимает постоянный законченный объект со статическим, потоковым или автоматическим сроком хранения, или в пределах хранилища, которое такой объект const использовал длязанимают до того, как закончится его время жизни, приводит к неопределенному поведению.

Прав ли я, что этот параграф применим для данного примера?Если нет, то где еще мне посмотреть?

1 Ответ

0 голосов
/ 18 февраля 2019

Это неопределенное поведение из-за попытки изменить переменную const после использования на ней const_cast.

Цитаты из n4659, окончательный рабочий проект C ++ 17.Соответствующий отрывок в этом случае:

8.2.11 Const cast [expr.const.cast]
...
6 [Примечание: В зависимости от типа объекта операция записи через указатель, lvalue или указатель на элемент данных, полученный в результате const_cast, который отбрасывает спецификатор const, может привести к неопределенному поведению.- конец примечания]

Этот раздел также имеет отношение к const объектам:

10.1.7.1 Спецификаторы cv [dcl.type.cv]
...
4 За исключением того, что любой член класса, объявленный изменяемым, может быть изменен, любая попытка изменить объект const во время его жизни приводит к неопределенному поведению.

...