通过引用传递容器时,自动参数或模板推导更好吗?



两者之间有什么区别(如果有的话(

template <typename T, int N>
void input (T (&Array) [N])
{
for (T& val: Array) cin >> val;
}

template <typename T>
void input (T (&Array))
{
for (auto& val: Array) cin >> val;
}

void input (auto& Array)
{
for (auto& val: Array) cin >> val;
}

哪个更好?

它们都可以在double store[5]上正常工作,但不能与vector <double> store一起使用

旁注:第一个版本不会使用T (&Array) []编译,因为它是"对未知边界数组的引用"。如果我们改写T& val: Array,第二个不会编译。

在数组参数的情况下,它们都具有相同的行为。在第一个中,T被推导出为元素类型;在其他情况下,Tauto推断数组类型。

当然,第二和第三种形式(它们是等效的,除了你不能为auto形式编写专用化(允许传递非数组参数。

正如 Frank 指出的那样,第一个版本只接受数组,而第二个和第三个版本也可以接受vectorlist

第二个和第三个版本似乎不适用于vector <double> store因为当向量为空时,for循环不会执行。

将其替换为vector <double> store (5, 0)

最新更新