【问题标题】:Is this trailing return type legal in C++11?这种尾随返回类型在 C++11 中是否合法?
【发布时间】:2016-09-26 09:37:10
【问题描述】:

以下内容:

auto (*f())() -> int;

在 C++11 模式下使用 Clang 给出错误:

error: 'auto' return without trailing return type;推导出来的回报 类型是 C++14 扩展

但在 C++14 模式下编译。 GCC 在-Wall -Wextra -pedantic 的两种模式下编译都没有抱怨。

n3337 7.1.6.4/2 说:

自动类型说明符可能与带有 trailing-return-type (8.3.5) 在这样的声明符所在的任何上下文中 有效。

8.3.5p2 讨论了函数声明符,但我太缺乏经验,无法弄清楚。谁能解释它在 C++11 中是否合法?

【问题讨论】:

  • 您是否要为函数指针 f 返回指定尾随返回类型?
  • 我猜GCC编译它是对的。 Coliru 的 Clang 和 GCC 都说它是 int (*(*)())()
  • 无论标准是否允许,这显然也是一个编译器错误。当存在尾随返回类型时,指出尾随返回类型被省略的错误消息是错误消息。
  • @chris 嗯?那可能是&f 的类型,但不是f 的类型,对吧?
  • @hvd,是的,我使用了一些 print_type(f); 的编译器错误技巧,所以它衰减了。

标签: c++ c++11 language-lawyer trailing-return-type


【解决方案1】:

这部分被CWG 1725覆盖:

对如下声明的处理尚不清楚:

auto (*f())() -> int; // #1

8.3.5 [dcl.fct] 第 2 段似乎需要确定嵌套声明符的类型

auto (*f()); // #2

其中,因为它没有 尾随返回类型,在 (C++11) 7.1.6.4 中格式错误 [dcl.spec.auto]。 (在 C++14 中,自动返回类型没有 trailing-return-type 当然是允许的。)

基本原理(2013 年 9 月):C++11 措辞的意图是尾随返回类型的要求仅适用于 auto 应用的声明符的顶层,而不适用于每个可能的递归声明器处理阶段。 [..]

另外,根据[dcl.fct]/2

T D 的声明中,D 的格式为

     D1 ( parameter-declaration-clause ) [...] trailing-return-type

声明T D1中包含的declarator-id的类型是“derived-declarator-type-listT” strong>, T 应该是单个 type-specifier auto.

如 DR 中所述,T D1auto (*f()),其类型为“() 的函数返回指向auto 的指针”(即符合要求)。因此,您的代码在 C++11 和 14 中均有效,f 的类型是“() 的函数返回指向() 函数的指针返回int”。

【讨论】:

    猜你喜欢
    • 2019-02-05
    • 2013-05-15
    • 2018-04-20
    • 2020-05-12
    • 1970-01-01
    • 2019-02-06
    • 2020-09-13
    • 2014-10-10
    • 1970-01-01
    相关资源
    最近更新 更多