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

时间:2019-04-12 15:25:36

标签: 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);

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

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

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

3 个答案:

答案 0 :(得分:8)

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

在您的示例中,T被推导为 var copy = object.onlyOwnProperties(); -我们将其称为int *。您正在引用intptr,因此返回值变为const。这就是说,指针本身不能通过该引用进行修改,但是其指向的值可以修改。

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

答案 1 :(得分:5)

第一个是正确的,返回类型为int * const &,即对 const指针的引用,该指针指向非常量int;不是const int * &,即指向const int的非常量指针的引用。

const本身受T的限制,当T是指针const T将是const指针但不是指向{{1}的指针} Pointee。

答案 2 :(得分:3)

const 一致位置在类型的右侧。某些声明(例如变量)也允许将const放在左侧,而其他声明(例如成员函数定义)仅允许const放在右侧。

如果您始终在正确的位置放置/应用const,则可以帮助您以正确的方式进行思考。这就是许多Boost库将const置于右侧的原因。

constify苹果const在右边,因此将T的{​​{1}}变成int*-指向非常数{{ 1}}。并在其右边应用引用:int* const