为什么C++不允许将const char*赋值给非const char*类型变量
问题代码
char* name; const char* _name = "something"; name = _name; // C++ 中该转换不被允许
禁止该操作的核心设计原因
- const语义的本质要求:
const修饰的指针代表了「不会通过该指针修改指向内容」的契约,如果允许把const char*隐式转为char*,相当于可以随便绕开这个契约,通过非const指针修改原本被const保护的内容,直接破坏了C++类型系统的安全性,这种漏洞当然是不被允许的。 - 字符串字面量的只读特性:代码里的
"something"属于字符串字面量,编译后默认会被放在程序的只读数据段,运行时本身就不允许修改。如果放开非const指针指向它的限制,后续不小心修改指针指向内容就会直接触发运行时段错误,C++选择把这个风险提前到编译阶段拦截,比运行时崩溃更容易定位问题。
需要额外说明的是,早期C语言是允许这种隐式转换的,属于历史遗留的兼容设计,但C++从诞生起就更重视类型安全,直接从语法层面禁止了这种不安全的隐式转换。就算你通过强制类型转换硬把const char*转为char*骗过编译器,后续修改字符串字面量的操作依然是未定义行为,绝大多数场景下都会导致程序崩溃。
内容的提问来源于stack exchange,提问作者Hashnut
相关产品推荐
相关产品推荐

