前几天,一位C++培训师告诉我,"const"只在编译时(静态)有意义,因此在运行时没有影响......但是当我测试这个例子时:
const int x = 5;
int * px = const_cast<int*>(&x);
*px = 10;
std::cout << "x = " << x <<std::endl; // x = 5 ???
Run Code Online (Sandbox Code Playgroud)
x不是用10修改的!然而,如果我们使用指针,这个例子按预期工作:
const int * x = new int(5);
int * px = const_cast<int*>(x);
*px = 10;
std::cout << "x = " << *x <<std::endl; // x = 10
Run Code Online (Sandbox Code Playgroud)
那么,这个C++教练是错的?
Sim*_*ple 10
修改const Tvia 是未定义的行为const_cast.这允许编译器在假设从未发生过的情况下优化代码.在您的第一个代码示例中,编译器可能5在调用期间在代码中插入了一个文字operator<<.
你的第二个例子是完全明确的,因为x它真的指向一个int,而不是一个const int.在这种情况下,抛弃constness很好.