【发布时间】:2019-09-03 09:56:37
【问题描述】:
我正在研究 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。但我的问题是;其中哪一项(如果有)是正确的,为什么?
【问题讨论】:
-
#1 是正确的,因为这就是语言规范所说的。
T是int*,指向int的指针。所以const T是int* const- 指向int的常量指针,而不是指向常量int的指针。const不会跳到类型的中间。