C++标准中哪一段禁止const指针转非const指针(如const char*转char*)?
C++标准中禁止const指针转非const指针的条款说明
你提到的直接将const char*类型实参传递给char*形参的操作,属于隐式转换范畴,这类转换被C++标准明确禁止,核心规则在不同版本标准中的对应位置如下:
C11及后续版本(以C20为例)
在C++20标准的 [conv.qual](限定符转换) 章节中,明确限定了指针/引用的cv限定符转换规则:
指向cv限定类型的指针或引用,仅能隐式转换为指向**更多cv限定(更严格)**类型的指针或引用;反之,从指向const/volatile限定类型的指针/引用,隐式转换为指向非限定类型的指针/引用是不允许的。
具体对应条款为[conv.qual]/3(不同版本标准的条款编号可能略有微调):
指向
const T的指针,无法隐式转换为指向T的指针;同理,指向const T的引用也不能隐式转换为指向T的引用。该规则的目的是防止通过非const指针/引用修改原本被const修饰的对象,破坏const语义的一致性。
对你提供的示例代码说明
#include <iostream> std::string message("Hello"); void my_log(char* pchar) { std::cout << pchar << '\n'; } void my_func(const std::string& message) { my_log(const_cast<char*>((&message)->c_str())); // 合法:显式使用const_cast完成转换 my_log((&message)->c_str()); // 编译失败:隐式将const char*转为char*违反标准规则 } int main() { my_func(message); }
std::string::c_str()返回的是const char*,直接传递给接收char*的my_log函数,属于隐式移除const限定符的操作,违反上述标准条款,因此编译报错。- 使用
const_cast<char*>是标准允许的显式转换,但需注意:若通过转换后的指针修改原本被const修饰的对象,会触发未定义行为。
内容的提问来源于stack exchange,提问作者Ayrosa
相关产品推荐
相关产品推荐

