Decuing Types 类型推断

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

f(expr);

在编译的时候,编辑器使用expr去推导两个类型:T 和 ParamType。例如:

template<typename T>
void f(const T& param);
int x = 0;
f(x);

这样T被推导为int,但是paramType被推导为const int&.

T的推导不仅依赖于expr,同时依赖于ParamType。有三种情况:

  1. ParamType是一个指针或者引用类型:
    a. f expr’s type is a reference, ignore the reference part.
    b. Then pattern-match expr’s type against ParamType to determine T.
  2. ParamType是一个全局引用
    • If expr is an lvalue, both T and ParamType are deduced to be lvalue references.
    That’s doubly unusual. First, it’s the only situation in template type deduction
    where T is deduced to be a reference. Second, although ParamType is declared
    using the syntax for an rvalue reference, its deduced type is an lvalue reference.
    • If expr is an rvalue, the “normal” (i.e., Case 1) rules apply.
  1. ParamType既不是指针也不是全局引用

posted on 2021-08-04 09:59  Ultraman_X  阅读(38)  评论(0编辑  收藏  举报

导航