模板参数会保留其传入类型的所有修饰符

在 C++中,模板参数会保留其传入类型的所有修饰符,包括const和引用(&&&)。这意味着如果你传递一个const类型或引用类型作为模板参数,模板会保留这些修饰符。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <typename T>
void func(T param) {
// param的类型会保留T的所有修饰符
}

int main() {
const int a = 10;
func(a); // T为const int

int b = 20;
func(b); // T为int

int& c = b;
func(c); // T为int&

const int& d = a;
func(d); // T为const int&
}

在这个例子中,func函数的模板参数T会保留传入参数的const和引用修饰符。因此,T的类型会根据传入的参数类型而有所不同。

如果你希望在模板中去掉这些修饰符,可以使用标准库中的类型萃取工具,如std::remove_conststd::remove_reference。例如:

1
2
3
4
5
6
7
#include <type_traits>

template <typename T>
void func(T param) {
using PlainType = typename std::remove_const<typename std::remove_reference<T>::type>::type;
// PlainType是去掉const和引用后的基本类型
}

这样,你可以在模板中根据需要处理类型的修饰符。