我可以合法地在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。
答案 0 :(得分:15)
是的,您可以提供参数名称。来自C ++ 11标准的第8.3.5 / 11段:
可以选择提供标识符作为参数名称;
指针到函数和指向成员的函数类型也是如此。就个人而言,只有当它更清楚地表达你的代码意图时,我才会使用该标识符。
答案 1 :(得分:9)
语言律师:
语法确实允许这样做。我是否也不清楚这是否是故意的。 声明符和抽象声明符的不同之处在于后者不允许在顶层使用名称。
声明符:
PTR声明符:
noptr声明符:
[
constant-expression (opt)]
attribute-specifier-seq (opt )(
ptr-declarator )
请注意,在声明符中,您可以拥有 declarator-id ,即名称。现在考虑 abstract-declarator 的语法:
抽象声明符:
PTR-抽象说明符:
noptr抽象说明符:
[
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 中的函数参数指定名称,即使整个函数类型不能给出名称。