我正在通过GDB对用C ++编写的项目进行调试,并发现在GNU C ++编译器中没有警告或错误地修改了const。
这不是我正在调试的程序,但这是我目睹的行为的一个例子:
#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
个对象的整个点。
我用g ++ main.c -Wall -Werror
编译了上面的代码输出:
*px: 11
x: 10
1
2
3
4
5
6
7
8
9
10
答案 0 :(得分:5)
就编译器而言,您不会修改常量。您正在修改指向非const int
的指针的内容,因为转换(int *)
告诉编译器将&x
视为。
这种所谓的C风格演员阵容是C ++提供的最强大的演员阵容。通常只能在真正必要的范围内进行施法。在许多情况下,const_cast
,static_cast
或dynamic_cast
就足够了(还有相当强大的reinterpret_cast
)。
C样式转换的行为是应用允许编译成功所需的最弱强大的转换。