我对以下代码段存在以下担忧:
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有何特殊之处,可以在上述情况下推论得出?
谢谢。
答案 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])。