试图了解const_cast的用法。代码如下:const_cast C++对我不起作用
const char* text="bb";
(const_cast<char&>(*text))='a';
cout<<*text;
...产生运行时错误。
另一个问题,在内存中,运行时(它)如何知道这个区域是否为常量,这种标记是什么?
试图了解const_cast的用法。代码如下:const_cast C++对我不起作用
const char* text="bb";
(const_cast<char&>(*text))='a';
cout<<*text;
...产生运行时错误。
另一个问题,在内存中,运行时(它)如何知道这个区域是否为常量,这种标记是什么?
该代码调用未定义的行为;写入字符串文字是无效的(实际上也不适用于任何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
为什么你说字符串const必须失败,你在这里指的是什么? – Moatz 2012-04-24 23:28:43
@Moatz:我的意思是不能保证写入字符串文字会导致崩溃或错误消息。 – 2012-04-24 23:35:05
该字符串可能放在静态内存中。所以这是一个未定义的行为。 试试这个
char t[]="bb";
const char* text = t;
(const_cast<char&>(*text))='a';
cout<<*text;
您只能const_cast会,你知道的东西是不是真的常量。在这种情况下,即使文本是const,我们也知道它指向的是不是const的。因此我们可以安全地抛弃const。
一般来说,运行时不知道是否知道某个特定变量是否实际为const
。如果抛弃const
-ness,如果最终写入一个定义为const的变量(而不是正常变量,您碰巧有一个const指针/引用),则会得到未定义的行为。
如果他们想要命令运行时知道const
的事情,那么当你写入const变量时,他们可能会规定特定的行为(例如抛出特定的异常)。有些系统很容易支持 - 但其他系统不会,所以不需要特定的响应。
恕我直言 - 这是一个坏主意使用强制转换 - 避免它们,只有在必要时才使用它们。我有强烈的感觉,那些使用演员的人在他们的设计上有错误。 – 2012-04-24 18:33:56