我在看一个代码片段
template <class RAIter>
void alg(RAIter, RAIter, std::random_access_iterator_tag)
{
std::cout << "alg() called for random-access iterator\n";
}我第一次只看到函数参数部分(std::random_access_iterator_tag)中的数据类型。我习惯于看
std::random_access_iterator_tag rand_iter;
这种表示形式在模板中是允许的,但在非模板函数中则不允许。
两个问题:
1)为什么只提到数据类型名称,而不提及它的变量?
2)为什么只允许使用模板功能,而不允许使用非模板功能?
发布于 2015-08-07 17:46:21
实际上,这与模板完全无关。
它是一个未命名的参数,在以下情况下是完全合法的:
基本上,你可以尊重一个签名,而不需要付出任何代价,例如:
float foo(float, int, float);
int main()
{
float x = foo(10.0f, 5, 20.0f);
return 0;
}
float foo(float a, int, float b)
{
return a+b;
}这在某些特定情况下很有用,可以考虑纯virtual方法或方法的前向声明。
在特定情况下,它有助于抑制未使用的参数警告,例如:
float foo(float a, int z, float b)
{
return a+b;
}这将在-Wunused-parameter中产生警告,但如果您明确声明不会通过删除它的名称来使用它,则不会。
发布于 2015-08-07 17:45:58
1)为什么只提到数据类型名称,而不提及它的变量?
因为不使用参数,所以不需要名称。
2)为什么只允许使用模板功能,而不允许使用非模板功能?
实际上,它也允许在非模板函数上使用。
https://stackoverflow.com/questions/31883694
复制相似问题