模板如何工作才能使编译器正确生成类以同时使用指针类型和非指针类型?

CPP*_*PPL 4 c++ templates pointers constants

给定

int i = 42;
int* p = &i;
Run Code Online (Sandbox Code Playgroud)

我们做不到

const int * & d = p;
Run Code Online (Sandbox Code Playgroud)

在我目前的理解中,这是因为const int * & d可以读作“d是一个指向 an 的指针的引用int,它是一个const”,并且p是“指向 an 的指针int”,这意味着 RHS 需要变成一个临时的“指向 an 的指针”。 anint是一个const" 并且不能直接与引用绑定(如在 LHS 上)。我们需要有,比如说,const int* const& d = p;。可能的参考文献1、2

也就是说,请考虑以下玩具代码:

template<typename T>
class X
{
public:
    void fun(const T& d) {  }
};
Run Code Online (Sandbox Code Playgroud)

起初我想如果我这样做

X<int*> x;
x.fun(p);
Run Code Online (Sandbox Code Playgroud)

编译器生成的方法是void fun(const int*& d),由于上述原因,我会得到一个错误。

但是,没有错误,并且它“按预期”工作(我的意思是,我们总是拥有d自己,因为const无论T被指针类型或非指针类型替换)。

我目前的猜测是,对于上述场景,编译器生成的方法类似于void fun(int* const& d).

请问我的猜测是否正确?模板如何工作以使编译器生成的类“按预期”使用指针?

son*_*yao 5

你的猜测是正确的。

对于const T,直接const根据类型进行限定。T给定Tis int*(non-const指向 non- 的指针const int),const T结果是const指针,即int* const(const指向 non- 的指针const int) 但不是const int*(non-const指向const int) 的指针。