我正在研究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);
我对返回类型有两种不同的期望:
const (int *) &
,即随后应用const,因此我们无法修改int指针,但可以修改其指向的指针。const int * &
,即所有声明符和限定符都一次应用,而不是像在1中那样。这里,我们不能再修改整数所指向的int,但是可以修改指针本身。对我来说,第一个更有意义,因为它后面有一个自然的“类似于替代”的规则,类似于typedef。但是我的问题是;其中哪些(如果有)是正确的,为什么?
答案 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
。