C++中typedef定义的指针加const修饰未按预期生效的原因是什么?
结论
这是C++ 语法本身的固有规则,和编译器实现无关。
核心原因
typedef 定义的是完整的类型别名,而非简单的文本替换,const 修饰类型别名时的作用逻辑和直接修饰原始类型完全不同:
const Y *语义是「指向const Y类型对象的指针」:指针本身可以修改指向,但指向的Y对象不允许修改,因此把该类型返回值赋值给Y*变量,相当于隐式丢弃了指向对象的const限定,编译器会直接禁止。YPTR是Y*的完整类型别名,const YPTR等价于Y * const而非const Y*:这里const修饰的是指针本身,语义是「指针自身的值(指向的地址)不可修改,但指向的Y对象可以修改」。
赋值可通过编译的底层逻辑
函数返回的const YPTR(也就是Y* const)是右值,对于内置类型的右值来说,顶层const(即修饰值本身的const)会被自动忽略。你把这个右值赋值给Y* y1ptr,只是拷贝了指针存储的地址值,并不会修改原返回值本身,也没有丢弃指向对象的const限定(本身指向的对象就没有const修饰),因此编译器完全允许这个操作。
补充说明
如果你想要用YPTR别名实现和const Y*等价的效果,不能直接在别名前加const,需要直接在别名定义里包含指向对象的const限定:
typedef const Y* ConstYPTR; // 此时ConstYPTR等价于const Y*
如果返回ConstYPTR类型,同样会出现赋值给Y*时编译器报错的效果。
内容的提问来源于stack exchange,提问作者R. Wenger
相关产品推荐
相关产品推荐

