You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

疑问

  1. 该代码输出PKPc,此输出具体代表什么含义?
  2. 为何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>的类型推导

我们可以逐层展开类型别名的定义:

  1. 先看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指针的指针)。
  2. 再看constptr2的定义:template<typename T> using constptr2 = const constptr1<T *>;,这里的const修饰的是constptr1<T*>这个指针类型本身,也就是给char* const *加上顶层const,最终得到char* const * const。

内容的提问来源于stack exchange,提问作者hstk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:30:06