为什么从const char*类型向char*赋值会报错,而从const char向char赋值就没问题?

zhoufanking 2005-10-22 11:18:40
rt
...全文
2309 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouhuahai 2005-10-26
  • 打赏
  • 举报
回复
为什么从const char*类型向char*赋值会报错

用这个:
const_cast<char *>
就可以了. .......... ^_^
qccbcsj 2005-10-26
  • 打赏
  • 举报
回复
哈哈,楼上的,多谢指教。
不过C标准给出的那个说法太咬文嚼字了,先记下字面意思啦。
AntonlioX 2005-10-26
  • 打赏
  • 举报
回复
mark
nanhaochen 2005-10-26
  • 打赏
  • 举报
回复
大家真热心啊
Ninputer 2005-10-26
  • 打赏
  • 举报
回复
用const_cast<T>运算符可以去除const,但是可能有危险,未必能把const类型转为非const类型
K 2005-10-26
  • 打赏
  • 举报
回复
向下兼容
xzgyb 2005-10-26
  • 打赏
  • 举报
回复
应该是
char * const和char *
char const 和 char
megaboy 2005-10-24
  • 打赏
  • 举报
回复
另外,我以为这里使用“左值、右值”的解释说法不对,因为这里讨论的两个指针本身都是变量,并不存在“变量赋值给常量”的问题。
书上说阿,C++中“左值不能是常量”。
-----------------------------------------------
你理解错了。在赋值表达式中,“左值不能包含限定词”与“指针间的赋值,左值必须包含右值的所有限定词”是两个规则,不同的。这里的情况并不属于“左值不能包含限定词”。楼上应该好好去读一下标准。
foxspace 2005-10-23
  • 打赏
  • 举报
回复
那反过来赋值可以吗?
Pigwen 2005-10-23
  • 打赏
  • 举报
回复
回复人: yc0188(守护瓶(萍)) ( ) 信誉:99 2005-10-23 00:07:00 得分: 0


cont char *str;// 是内容不可修改, 并不是指针不可修改.
char cont *str;// 是指针不可修改, 并不是内容不可修改.


-----------------------------------------------------------------------
char const *str 和 const char *str是一样的,都是内容不可变,指针可变。
char* const str才是指针不可变,内容可变。
楼主的问题一楼说得很清楚哈。
yuchengliu 2005-10-23
  • 打赏
  • 举报
回复
cont char *str;// 是内容不可修改, 并不是指针不可修改.
char cont *str;// 是指针不可修改, 并不是内容不可修改.
qccbcsj 2005-10-23
  • 打赏
  • 举报
回复
另外,我以为这里使用“左值、右值”的解释说法不对,因为这里讨论的两个指针本身都是变量,并不存在“变量赋值给常量”的问题。
书上说阿,C++中“左值不能是常量”。
qccbcsj 2005-10-23
  • 打赏
  • 举报
回复
晕,修正一下:
“这是C++为了保证字符串常量不会被修改而做出的设定”中的“字符串常量”修改为“文字常量”。

发帖是就看不到,一完成就看见错误啊啊啊啊!郁闷。
qccbcsj 2005-10-23
  • 打赏
  • 举报
回复
我认为原因是:
C++不允许用一个变量指针(char *)指向一个文字常量(const char * 是一个字符型常量指针)。
这是C++为了保证字符串常量不会被修改而做出的设定。
反过来,C++允许常量指针指向一个变量,也就是说把一个char *赋值给 const char *类型的操作是允许的——C++保证不能通过常量指针修改它所指向的任何对象[即使是个变量]。

比如一个const类成员函数如果含有变量指针,就有可能修改该变量指针所指向的操作,这是危险的。——哈,这方面我也很生疏不多说啦。

就像林锐博士的C++高级编程说的那样,对于这方面的东西,最好熟悉“变量指针、常量指针、const”等的相关内容,Primer等C++学习书籍上都有详细的叙述。
codearts 2005-10-23
  • 打赏
  • 举报
回复
以*号做为分界

const在左边,表示指针指向的数据为const
const在右边,表示指针为const
fangrk 2005-10-23
  • 打赏
  • 举报
回复
可以把const char*看作只能使用220V电压的电器
char*看作110V--250V的电器

那么把你把110V--250V的电器接在220V上使用

但你不能把220V电器接在110V--250V电压上使用
newbiestar 2005-10-23
  • 打赏
  • 举报
回复
回复人: foxspace(幽谷灵狐) ( ) 信誉:100 2005-10-23 00:16:00 得分: 0


那反过来赋值可以吗?

===================================
反过来是可以的,在重载函数解析的时候从char*到const char*的转换是一个精确匹配,属于限定转换
newbiestar 2005-10-23
  • 打赏
  • 举报
回复
const char*到char*不存在内容复制的过程,所以这个是不允许的

而const char到char存在了必需的内容复制过程,所以这个是允许的。如果这个不允许的话,那么int ival = 1;这样的初始化就不能存在了
megaboy 2005-10-22
  • 打赏
  • 举报
回复
c标准规定,指针间的赋值,左值必须包含右值的所有限定词。把char*赋值给const char*,作为左值的char *并没有包含作为右值的const char *的限定词const,因此非法。
v41dugu 2005-10-22
  • 打赏
  • 举报
回复
呵呵 这个问题最近有很多人问了~~
加载更多回复(1)

64,701

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧