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
相关产品推荐
相关产品推荐

