C++别名模板代码疑问:PKPc含义与类型等价性解析
#include<iostream> #include<typeinfo> using namespace std; template<typename T> using constptr1 = const T*; template<typename T> using constptr2 = const constptr1<T *>; int main() { constptr2<char> c = nullptr; cout << typeid(decltype(c)).name() << "\n"; return 0; }
疑问
- 该代码输出
PKPc,此输出具体代表什么含义? - 为何
constptr2<char>等价于char * const* const类型?
解答
1. 关于输出PKPc的含义
PKPc是GCC编译器对C++类型进行**名称修饰(Name Mangling)**后的结果,用来在编译阶段区分不同的类型(尤其是模板、重载函数等)。
可以通过GCC自带的c++filt工具解析为可读类型:执行c++filt -t PKPc会得到char* const*。这里需要注意:C++标准规定typeid会忽略顶层const(即指针自身的const限定),而代码中c的实际类型是char* const* const,顶层const被typeid忽略后,最终输出的是char* const*的修饰名。
拆解修饰名的组成:
P:表示“指针(pointer)”K:表示“const限定(源自德语Konstante)”c:表示“char类型”- 组合逻辑:从内到外解析,
Pc是char*,KPc是char* const,PKPc就是“指向char* const的指针”,即char* const*。
2. 关于constptr2<char>的类型推导
我们可以逐层展开类型别名的定义:
- 先看
constptr1的定义:template<typename T> using constptr1 = const T*;,它等价于T const*,也就是指向const T的指针。
当模板参数传入char*时(即constptr1<char*>),const T*就变成const (char*) *——这里的const修饰的是char*这个指针类型本身,因此等价于char* const *(指向const char指针的指针)。 - 再看
constptr2的定义:template<typename T> using constptr2 = const constptr1<T *>;,这里的const修饰的是constptr1<T*>这个指针类型本身,也就是给char* const *加上顶层const,最终得到char* const * const。
内容的提问来源于stack exchange,提问作者hstk
相关产品推荐
相关产品推荐

