试图了解 const_cast 的用法。代码如下:
const char* text="bb";
(const_cast<char&>(*text))='a';
cout<<*text;
...生成运行时错误。
另一个问题,在内存中,运行时(它)如何知道该区域是否为 const,这是什么标志?
该代码调用未定义的行为;写入字符串文字(实际上也不写入任何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
该字符串可能被放入静态内存中。所以这是一种未定义的行为。尝试这个
char t[]="bb";
const char* text = t;
(const_cast<char&>(*text))='a';
cout<<*text;
你只能 const_cast 一些你知道不是真的 const 的东西。在这种情况下,即使 text 是 const,我们也知道它指向的 t 不是 const。因此,我们可以安全地抛弃 const。
一般来说,运行时不知道特定变量是否实际上是const
. 如果你抛弃const
-ness,如果你最终写入一个定义为 const 的变量(而不是你碰巧有一个 const 指针/引用的普通变量),你会得到未定义的行为。
如果他们想强制运行时“知道”事物的存在const
,那么当/如果您写入 const 变量时,他们可能会规定特定的行为(例如,抛出特定的异常)。一些系统会很容易地支持这一点——但其他系统不会,因此不需要特定的响应。