2012-04-24 30 views
0

试图了解const_cast的用法。代码如下:const_cast C++对我不起作用

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

...产生运行时错误。

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

+0

恕我直言 - 这是一个坏主意使用强制转换 - 避免它们,只有在必要时才使用它们。我有强烈的感觉,那些使用演员的人在他们的设计上有错误。 – 2012-04-24 18:33:56

回答

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 
+0

为什么你说字符串const必须失败,你在这里指的是什么? – Moatz 2012-04-24 23:28:43

+0

@Moatz:我的意思是不能保证写入字符串文字会导致崩溃或错误消息。 – 2012-04-24 23:35:05

0

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

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

您只能const_cast会,你知道的东西是不是真的常量。在这种情况下,即使文本是const,我们也知道它指向的是不是const的。因此我们可以安全地抛弃const。

+0

2-如何从stackoverflow获得有关C++相关问题的通知? 3-任何建议如何得到这本书:罗伯特Sedgewick算法在C++ part1-4 最好, – Moatz 2012-04-24 23:26:39

+0

如何将字符串放置为静态? t []和char *之间有什么不同? – Moatz 2012-04-24 23:27:43

+0

'char []'是一个数组。 'char *'是一个指向可能使用'char []'或''blah“'或'malloc(n)'创建的char的指针' – balki 2013-02-08 16:07:31

0

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

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