我通过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

最佳答案

就编译器而言,您无需修改​​常量。您正在修改指向非常量int的指针指向的内容,因为这是强制转换(int *)告诉编译器将&x视为的内容。

这种所谓的C样式转换是C++提供的最强大的转换。通常只应在确实必要的范围内进行转换。在许多情况下,const_caststatic_castdynamic_cast就足够了(还有相当强大的reinterpret_cast)。

C样式强制转换的行为是应用使编译成功所需的功能最弱的强制转换。

关于c++ - 为什么GNU C++编译器允许您修改常量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28242859/

10-16 04:33
查看更多