函数模板中的数组值类型推导

时间:2018-10-25 06:52:10

标签: c++ templates

我对以下代码段存在以下担忧:

template<std::size_t Dim, std::size_t N,
  typename RangeType1, typename RangeType2>
void multilinear_interp(
  const RangeType1 (&coordsFrom)[Dim],
  const std::array<RangeType2, N>& field)
{
   // do something
}

int main()
{ 
    std::vector<double> x{}, y{};
    std::vector<float> f0{}, f1{};

    multilinear_interp<2, 2>({x, y}, {f0, f1});
}

看起来编译器可以推断RangeType1,但不能推断RangeType2,并且编译失败。是否可以使用std :: array而不显式指定multiliner_interp的所有模板参数?如果不是,那么 const T(&)[Dim] w.r.t std :: array有何特殊之处,可以在上述情况下推论得出?

谢谢。

1 个答案:

答案 0 :(得分:2)

是的,没有从std::array甚至{f0, f1}中推论出像{{f0, f1}}这样的容器(如果最初的想法是大括号省略)。原因是括号括起的初始化程序不是表达式。它没有可从中推断出 的类型。因此,通常将其归类为非推论上下文(即无法从中推导出模板参数)。

关于在常规C样式数组引用中为何起作用的原因,是因为为它们和std::initializer_list参数显式地创建了一个异常。所有这些都在同一标准段落中描述:

  

[临时扣除电话]

     

1模板参数推导是通过比较每个函数来完成的   包含 template-parameters 的模板参数类型(称为P)   参与模板参数推导的类型   相应的调用参数(称为A),如下所述。如果   从P删除引用和简历限定符可得出   std​::​initializer_­list<P'>P'[N]用于某些P'N,   参数是一个非空的初始值设定项列表([dcl.init.list]),然后   而是对初始化程序的每个元素执行推导   列表,将P'作为函数模板参数类型,并将   初始值设定项元素作为其参数,在P'[N]的情况下,如果N是一个   非类型模板参数N由   初始化列表。否则,初始化列表参数会导致   参数视为非推导上下文([temp.deduct.type])。