我可以在std :: function模板签名类型参数中使用命名参数吗?

时间:2014-09-08 18:13:17

标签: c++ c++11 std-function

我可以合法地在std::function(或其他类似构造)中使用模板参数的名称吗?例如。给出代码

std::function<int(int, int)> some_func;

我可以按照以下方式重写吗?

std::function<int(int begin, int end)> some_func;

如果它符合标准,那将是非常好的,因为单独的类型几乎没有关于参数用途的信息。

到目前为止,我已经在Visual Studio 2013中对其进行了测试,但它确实有效。编辑:它也适用于gcc 4.8.1。

2 个答案:

答案 0 :(得分:15)

是的,您可以提供参数名称。来自C ++ 11标准的第8.3.5 / 11段:

  

可以选择提供标识符作为参数名称;

指针到函数和指向成员的函数类型也是如此。就个人而言,只有当它更清楚地表达你的代码意图时,我才会使用该标识符。

答案 1 :(得分:9)

语言律师:

语法确实允许这样做。我是否也不清楚这是否是故意的。 声明符抽象声明符的不同之处在于后者不允许在顶层使用名称。

声明符

  • PTR声明符
  • noptr-declarator 参数和限定符 trailing-return-type

PTR声明符

  • noptr声明符
  • ptr-operator ptr-declarator

noptr声明符

  • declarator-id attribute-specifier-seq (opt)
  • noptr-declarator 参数和限定符
  • noptr-declarator [ constant-expression (opt)] attribute-specifier-seq (opt )
  • ( ptr-declarator )

请注意,在声明符中,您可以拥有 declarator-id ,即名称。现在考虑 abstract-declarator 的语法:

抽象声明符

  • PTR-抽象说明符
  • noptr-abstract-declarator (opt)参数和限定符 trailing-return-type
  • 抽象包说明符

PTR-抽象说明符

  • noptr抽象说明符
  • ptr-operator ptr-abstract-declarator (opt)

noptr抽象说明符

  • noptr-abstract-declarator (opt) parameters-and-qualifiers
  • noptr-abstract-declarator (opt)[ constant-expression (opt)] attribute-specifier-seq < / em>(opt)
  • ( ptr-abstract-declarator )

abstract-declarator 不能在顶层包含 declarator-id 。但是,请注意 abstract-declarator noptr-abstract-declarator 的生产规则中出现的 parameters-and-qualifiers 是相同的就像声明符 noptr-declarator 中的那样。没有特殊的 abstract-parameters-and-qualifiers 来强制在 abstract-declarator 中出现的参数列表中没有名称。因此,语法允许为 abstract-declarators 中的函数参数指定名称,即使整个函数类型不能给出名称。