【发布时间】:2021-03-18 02:04:36
【问题描述】:
我正在学习如何在 C++11 中使用模板,我刚刚阅读了一篇关于模板的文章,它通过参考向我展示了类型推导的规则。例如,
template<typename T>
void f(const T& param);
int x = 27;
const int cx = x;
const int& rx = x;
f(x); // T is int, param's type is const int&
f(cx); // T is int, param's type is const int&
f(rx); // T is int, param's type is const int&
f(27); // T is int, param's type is const int&
另外,它还谈到了引用折叠:
template<typename T>
void f(T&& param);
int x = 27;
const int cx = x;
const int& rx = x;
f(x); // x is lvalue, so T is int&, param's type is int&
f(cx); // cx is lvalue, so T is const int&, param's type is const int&
f(rx); // rx is lvalue, so T is const int&, param's type is const int&
f(27); // 27 is rvalue, so T is int, param's type is int&&
嗯,现在我明白了所有这些,但现在,我正在考虑指针。这个问题彻底炸了我的大脑,但似乎它会变得非常复杂。
例如,假设我们有int *、const int *。现在,如果我们在下面有 threse 模板函数:
template<typename T>
void f(T param);
template<typename T>
void f(T *param);
template<typename T>
void f(const T *param);
template<typename T>
void f(T& param);
template<typename T>
void f(const T& param);
template<typename T>
void f(T&& param);
如果我们传递一个int *,编译器如何进行类型推导? const int * 呢?
【问题讨论】:
-
为什么你认为指针有什么不同?指针具有类型。
int是一种类型。int*是另一种类型。扣除发生在类型上。所以T将是一个指针类型,如果一个指针被传递给param。
标签: c++ c++11 templates template-argument-deduction type-deduction