【问题标题】:Can I use named parameters in std::function template signature type argument?我可以在 std::function 模板签名类型参数中使用命名参数吗?
【发布时间】:2014-11-02 01:03:02
【问题描述】:

我可以在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。

【问题讨论】:

  • 你试过了吗?如果有效,那么......那么你可以。
  • @RaydelMiranda:这只会证明他的编译器接受它,而不是标准允许它。
  • §8.3.5/11 [dcl.fct] “可以选择提供标识符作为参数名称;” int (int, int) 是一个函数,因此该子句适用于此。
  • int (*foo)(int begin, int end) = nullptr 基本上。
  • @RaydelMiranda:引用问题(我强调):“我可以合法使用[…]”,“[…]如果它符合标准, […]" 这清楚地表明问题在于标准允许什么。

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


【解决方案1】:

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

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

指针到函数和指针到成员函数类型也是如此。就个人而言,我只会在更清楚地表达代码意图的情况下使用标识符。

【讨论】:

    【解决方案2】:

    语言律师:

    语法确实允许这样做。我不清楚这是否是故意的。 declaratorabstract-declarator 的不同之处在于后者不允许在顶层使用名称。

    声明符

    • ptr 声明符
    • noptr-declarator parameters-and-qualifiers trailing-return-type

    ptr 声明符

    • noptr 声明符
    • ptr 运算符 ptr 声明符

    noptr 声明符

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

    请注意,在 declarator 中可以有一个 declarator-id,即名称。现在考虑 abstract-declarator 的语法:

    抽象声明符

    • ptr-abstract-declarator
    • noptr-abstract-declarator (opt) parameters-and-qualifiers trailing-return-type
    • 抽象包声明器

    ptr-abstract-declarator

    • noptr-abstract-declarator
    • ptr-operator ptr-abstract-declarator (opt)

    noptr-abstract-declarator

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-21
      • 2015-12-09
      • 1970-01-01
      • 2011-03-24
      • 2023-01-31
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      相关资源
      最近更新 更多