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

C++模板如何适配指针与非指针类型?常量引用问题解析

C++中const T&模板参数的实例化问题

先看一段基础代码:

int i = 42;
int* p = &i;

下面这段代码无法通过编译:

const int * & d = p;

原因是:const int * & d的含义是d是指向const int的指针的左值引用,而p是指向int的指针。将p绑定到这个引用时,需要先把p转换为临时的const int*对象,但临时对象不能直接绑定到非const的左值引用。解决方法是把声明改为const int* const& d = p;——此时引用绑定的是指向const int的常量指针,临时对象可以绑定到const左值引用。

再看以下模板代码:

template<typename T>
class X
{
public:
    void fun(const T& d) {  }
};

当实例化X<int*> x; x.fun(p);时,最初误以为编译器会生成void fun(const int*& d),这会触发上述编译错误,但实际编译正常,且符合预期:无论T是指针还是非指针类型,d本身都不可修改。

由此提出两个问题:

  • 猜想编译器实际生成的函数是void fun(int* const& d),这个猜想是否正确?
  • C++模板是如何实现同时适配指针与非指针类型的?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:57:24