C++ 查询c++;迭代器标签
我正在浏览一段代码片段C++ 查询c++;迭代器标签,c++,C++,我正在浏览一段代码片段 template <class RAIter> void alg(RAIter, RAIter, std::random_access_iterator_tag) { std::cout << "alg() called for random-access iterator\n"; } 模板 void alg(RAIter,RAIter,std::随机访问迭代器标记) { 标准::cout 1) 为什么只提到数据类型名称而没有提到它的变量
template <class RAIter>
void alg(RAIter, RAIter, std::random_access_iterator_tag)
{
std::cout << "alg() called for random-access iterator\n";
}
模板
void alg(RAIter,RAIter,std::随机访问迭代器标记)
{
标准::cout
1) 为什么只提到数据类型名称而没有提到它的变量
由于未使用参数,因此不需要名称
2) 为什么它只允许用于模板化函数,而不允许用于非模板化函数
实际上,在非模板函数上也允许使用它。事实上,这与模板无关
这是一个未命名的参数,在以下情况下完全合法:
- 声明一个方法(因此没有正文)
- 定义不使用该参数的方法
基本上,您可以在不使用命名参数的情况下尊重签名,例如:
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参数的警告
,但如果您明确声明您不会通过删除其名称来使用它,则不会发出警告。任何函数都可以有未命名的参数。非模板函数不能有未命名的参数,这是从古代ANSI C之前遗留下来的,不是吗?