0

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

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

...生成运行时错误。

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

4

3 回答 3

8

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

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

但是,有些用途const_cast不会调用未定义的行为。例如:

int x = 5;  // Not a const object

const int *p = &x;

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

*q = 6;  // This is ok
于 2012-04-24T18:31:50.177 回答
0

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

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

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

于 2012-04-24T18:33:22.253 回答
0

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

如果他们想强制运行时“知道”事物的存在const,那么当/如果您写入 const 变量时,他们可能会规定特定的行为(例如,抛出特定的异常)。一些系统会很容易地支持这一点——但其他系统不会,因此不需要特定的响应。

于 2012-04-24T18:35:37.950 回答