const_cast c ++对我不起作用

时间:2012-04-24 18:29:45

标签: c++ casting const

试图了解const_cast的用法。代码如下:

const char* text="bb";
(const_cast<char&>(*text))='a';
cout<<*text;

...生成运行时错误。

另一个问题,在内存中,运行时(它)如何知道这个区域是不是const,这是什么样的标志?

3 个答案:

答案 0 :(得分:8)

该代码调用未定义的行为;写入字符串文字(也不是任何const对象)无效。

C ++标准没有定义它应该如何失败(甚至必须失败)。但在典型的平台上,将由操作系统和底层硬件来检测问题。 "bb"的存储通常位于可执行文件的专用部分中,该部分标记为只读。参见例如http://en.wikipedia.org/wiki/Memory_protection

但是,const_cast的使用不会调用未定义的行为。 e.g:

int x = 5;  // Not a const object

const int *p = &x;

int *q = const_cast<int *>(p);

*q = 6;  // This is ok

答案 1 :(得分:0)

字符串可能放在静态内存中。所以这是一个未定义的行为。 试试这个

char t[]="bb";
const char* text = t;
(const_cast<char&>(*text))='a';
cout<<*text;

你只能const_cast一些你知道不是真正的const。在这种情况下,即使text是const,我们也知道它指向不是const的t。因此,我们可以安全地抛弃const。

答案 2 :(得分:0)

一般来说,运行时知道某个特定变量是否实际为const。如果你抛弃const - ness,如果你最终写入定义为const的变量(而不是你碰巧有一个const指针/引用的普通变量),你会得到未定义的行为。

如果他们想要命令运行时“知道”关于const的事情,那么当你/写一个const变量时,他们可能会规定特定的行为(例如,抛出一个特殊的异常) 。有些系统很容易支持 - 但其他系统则不支持,因此不需要特定的响应。