首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++迭代器标签的查询

c++迭代器标签的查询
EN

Stack Overflow用户
提问于 2015-08-07 17:42:24
回答 2查看 122关注 0票数 2

我在看一个代码片段

代码语言:javascript
复制
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)为什么只允许使用模板功能,而不允许使用非模板功能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-07 17:46:21

实际上,这与模板完全无关。

它是一个未命名的参数,在以下情况下是完全合法的:

  • 声明一个方法(所以你没有身体)
  • 定义不使用该参数的方法

基本上,你可以尊重一个签名,而不需要付出任何代价,例如:

代码语言:javascript
复制
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方法或方法的前向声明。

在特定情况下,它有助于抑制未使用的参数警告,例如:

代码语言:javascript
复制
float foo(float a, int z, float b)
{
  return a+b;
}

这将在-Wunused-parameter中产生警告,但如果您明确声明不会通过删除它的名称来使用它,则不会。

票数 3
EN

Stack Overflow用户

发布于 2015-08-07 17:45:58

1)为什么只提到数据类型名称,而不提及它的变量?

因为不使用参数,所以不需要名称。

2)为什么只允许使用模板功能,而不允许使用非模板功能?

实际上,它也允许在非模板函数上使用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31883694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档