Я удалял проект, написанный на C++ через GDB, и обнаружил, что const был модифицирован без предупреждения или ошибки компилятором GNU C++.Почему компилятор GNU C++ позволяет вам изменять константу?
Это не программа, которую я был отладки, но это пример поведения я засвидетельствовал:
#include <iostream>
int main(int argc, char *argv[]) {
const int x = 10;
int *px = (int *)&x;
++*px;
std::cout << "*px: " << *px << "\n";
std::cout << "x: " << x << "\n";
for (int i = 0; i < x; ++i)
std::cout << i+1 << "\n";
return 0;
}
Я не могу говорить за других компиляторов, потому что я только проверил это с компилятором GNU C++, версия 4.9.2. Почему это разрешено? Это разрушает всю точку const
объектов.
Я скомпилировал код выше с г ++ main.c -Wall -Werror
Выход:
*px: 11
x: 10
1
2
3
4
5
6
7
8
9
10
[Изменение константы не определено] (http://stackoverflow.com/q/22656734/1708801), поэтому результаты непредсказуемы. Компилятор не должен создавать диагностику для неопределенного поведения ... связанный вопрос, вероятно, является дубликатом –
Вот почему вы почти ** не должны использовать C-стиль в C++. – ereOn
точно. предпочитают 'const_cast': P –