在C ++中,如何将const应用于参数列表之外的模板参数类型?

Sim*_*rak 5 c++ templates const

我正在研究C ++模板,并且一直在思考const和作为模板函数参数的类型之间的相互作用。具体来说,我在考虑在模板参数列表之外应用const时如何与模板类型进行交互。

我曾尝试在C ++ Primer 5th ed(Lippman)和C ++ 11标准草案中寻找这种交互,但是在这种情况下const并未明确提及,或者(在标准的情况下)其描述相当复杂(我还是C ++的新手。

这是我的问题的代码示例:

template<typename T>
const T & constify(T & t) {
    return t;
}

...

int* i = 0x12345678; 
constify(i);
Run Code Online (Sandbox Code Playgroud)

我对返回类型有两种不同的期望:

  1. 推导的返回类型为const (int *) &,即在之后应用const,因此我们无法修改int指针,但可以修改其指向的指针。
  2. 推导的返回类型为const int * &,即所有声明符和限定符都一次应用,而不是像1中那样。这里,我们不再可以修改整数所指向的int,而是可以修改指针本身。

对我来说,第一个更有意义,因为它背后有一个自然的“替代类”规则,类似于typedef。但是我的问题是;其中哪些(如果有)是正确的,为什么?

Ser*_*eyA 8

模板类型替换不是文本类型的,因此不要从文本类型定义的角度来考虑它们。

在你的榜样,T推断为int *-让我们把它intptr。您正在const引用它,因此返回值变为const intptr&。这意味着指针本身不能通过此引用进行修改,但是它指向的值可以修改。

最后但并非最不重要的一点是,在提出问题之前,您可以轻松验证您的假设:)


son*_*yao 5

所述第一一个是正确的,并返回类型将是int * const &,即,参照const指针以非const int; 不是const int * &,即对非常量指针的引用const int

constT本身是合格的,当T指针const T将是const指针,而不是指向constpointee的指针时。