【问题标题】:What is the rules of type deduction while passing pointer to template argument将指针传递给模板参数时类型推导的规则是什么
【发布时间】: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


【解决方案1】:

如您所知,模板中的类型推导分为三个不同的类别,其中模板函数的参数类型是 1) 引用或指针,2) 转发(也称为通用)引用,或者最后 3) 既不是指针/参考或转发参考。

所以,如果你有一个指针,那么类型推导就是这三种情况。

对于案例 1-A:

template<typename T>
void f(T* param);

int x = 27;
int* px = &x;
const int* cpx = &x;

f(px);   // T is int and param's type is int *
f(cpx);  // T is const int and param's type is const int *

对于案例 1-B:

template<typename T>
void f(T& param);

int x = 27;
int* px = &x;
const int* cpx = &x;

f(px);   // T is int* and param's type is int*&
f(cpx);  // T is const int* and param's type is const int*&

对于案例 2:

template<typename T>
void f(T&& param);

int x = 27;
int* px = &x;
const int* cpx = &x;

f(px);   // T is int*& and param's type is int*&
f(cpx);  // T is const int*& and param's type is const int*&

对于案例 3:

template<typename T>
void f(T param);

int x = 27;
int* px = &x;
const int* cpx = &x;

f(px);   // T is int * and param's type is int *
f(cpx);  // T is const int * and param's type is const int *

【讨论】:

  • 非常感谢老兄。它有助于。那么你会添加案例4:template&lt;typename T&gt; void f(T &amp;param);吗?至少,它可能对我也有帮助。
  • @Yves 你说的case不是case 4,而是case 1的一部分,因为类型推导规则是差不多的。因此,我将案例 1 分为案例 1-A 和案例 1-B 以进行更多说明。
猜你喜欢
  • 1970-01-01
  • 2014-04-17
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多