通过引用传递容器时,自动参数或模板推导哪个更好?
When passing containers by reference, is auto parameter or template deduction better?
之间有什么区别(如果有的话)
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) []
进行编译,因为它是 "reference to array of unknown bound"。如果我们改写 T& val: Array
,第二个将不会编译。
在数组参数的情况下,它们都具有相同的行为。在第一个中 T
被推导为元素类型;在其他情况下,T
或 auto
推导出数组类型。
当然,第二种和第三种形式(除了不能为 auto
编写专门化之外,它们是等效的)允许传递非数组参数。
正如 Frank 指出的那样,第一个版本只接受数组,而第二个和第三个版本也可以接受 vector
或 list
第二个和第三个版本似乎不适用于 vector <double> store
,因为当向量为空时 for
循环不会执行。
将其替换为 vector <double> store (5, 0)
。
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) []
进行编译,因为它是 "reference to array of unknown bound"。如果我们改写 T& val: Array
,第二个将不会编译。
在数组参数的情况下,它们都具有相同的行为。在第一个中 T
被推导为元素类型;在其他情况下,T
或 auto
推导出数组类型。
当然,第二种和第三种形式(除了不能为 auto
编写专门化之外,它们是等效的)允许传递非数组参数。
正如 Frank 指出的那样,第一个版本只接受数组,而第二个和第三个版本也可以接受 vector
或 list
第二个和第三个版本似乎不适用于 vector <double> store
,因为当向量为空时 for
循环不会执行。
将其替换为 vector <double> store (5, 0)
。