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

时间:2018-05-27 19:09:18

标签: templates c++14 auto ranged-loops

之间有什么区别(如果有的话)
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,则第二个将无法编译。

2 个答案:

答案 0 :(得分:0)

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

当然,第二种和第三种形式(除了不能为auto编写专门化之外,它们是相同的)允许传递非数组参数。

答案 1 :(得分:0)

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

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

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