这种尾随返回类型在C++11中合法吗
Is this trailing return type legal in C++11?
以下内容:
auto (*f())() -> int;
在C++11模式中给出一个错误,Clang说:
错误:"auto"返回,没有尾随返回类型;推断收益类型是C++14扩展
但在C++14模式下编译。GCC使用-Wall -Wextra -pedantic
在两种模式下都进行编译而不抱怨。
n3337 7.1.6.4/2说:
自动类型说明符可能与带有尾部返回类型(8.3.5)有效的
8.3.5p2谈到函数声明符,但我太缺乏经验,无法理解。有人能解释一下它在C++11中是否合法吗?
这部分由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中,一种不带当然,允许使用尾随返回类型。)
理由(2013年9月):C++11措辞的目的是,对尾随返回类型的要求仅适用于auto适用的声明器的顶层,而不适用于声明器处理中的每个可能的递归阶段[..]
此外,根据[dcl.fct]/2,
在声明
T D
中,其中D
的形式为nbsp nbsp
D1
(
参数声明子句)
[…]尾随返回类型并且声明
T D1
中包含的声明符id的类型为">派生的声明符类型列表T
">,T
应为单个类型说明符auto
。
如DR中所述,T D1
是auto (*f())
,其类型为"()
返回指向auto
的指针的函数"(即符合要求)。因此,您的代码在C++11和14中都是有效的,并且f
的类型是"()
的函数返回指针到()
的函数返回int
"。
相关文章:
- c++ 11 带有 decltype 的尾随返回类型无法按预期工作
- 在 C++11 函数中使用尾随返回类型的优点
- 具有尾随返回类型的通用 lambda,具体取决于 C++11 中的可变参数
- BackPort C 14返回类型扣除对C 11
- C++11 中的 decltype(auto) - 推断返回类型
- 是在C 11中没有返回类型的主机的使用情况
- 找出函子的返回类型 C++11Boost
- 这种尾随返回类型在C++11中合法吗
- 如何获取 lambda 的返回类型,在 C++11 中归约函数
- C++11:return_type(对于 std::bind),其中返回类型基于输入类型
- C++11-返回一个表达式以确定类型
- 我们什么时候可以省略 C++11 lambda 中的返回类型
- C++11 非模板化基类中的纯虚拟'templated'返回类型
- 如何在 C++11 之前模拟尾随返回类型的 decltype
- C++11 在特定情况下避免冗余返回类型
- 返回类型的C++11 方法模板专用化
- C++11对lambda返回类型的限制
- 带有返回类型推导的C++11运算符重载
- 在C++11中确定泛型返回类型时出错
- 模板方法中的C++11自动返回类型