首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后继返回类型中的占位符是否覆盖初始占位符?

后继返回类型中的占位符是否覆盖初始占位符?
EN

Stack Overflow用户
提问于 2014-06-17 09:17:03
回答 1查看 401关注 0票数 6

g++似乎接受autodecltype(auto)的任何组合作为初始和尾部返回类型:

代码语言:javascript
复制
int a;
auto f() { return (a); }                             // int
auto g() -> auto { return (a); }                     // int
auto h() -> decltype(auto) { return (a); }           // int&
decltype(auto) i() { return (a); }                   // int&
decltype(auto) j() -> auto { return (a); }           // int
decltype(auto) k() -> decltype(auto) { return (a); } // int&

然而,clang拒绝jk,并说:错误:带有尾部返回类型的函数必须指定返回类型'auto',而不是'decltype(auto)‘(游行示威)。

哪个编译器是正确的?在每种情况下都应该使用哪种规则(autodecltype(auto))?在尾部返回类型中使用占位符类型有意义吗?

EN

回答 1

Stack Overflow用户

发布于 2014-06-17 10:03:00

@Xeo建设性意见后编辑:

这个问题似乎是由于标准草案的两个地方之间的矛盾。

根据草案标准§7.1.6.4自动说明符dcl.spec.auto

1 autodecltype(auto) 类型说明符指定一个占位符类型,该类型将在稍后被替换,或者从初始化项中扣除,或者通过显式规范来替换,并带有尾随返回类型。自动类型说明符也用来表示lambda是泛型lambda。 占位符类型可以与函数声明符一起出现在decl-说明符-seq、类型说明符-seq、转换-函数id或trailing-return-type,中,在此类声明符有效的任何上下文中。如果函数声明器包含一个尾部返回类型(8.3.5),则指定函数的声明返回类型。如果函数的声明返回类型包含占位符类型,则从函数正文中的返回语句(如果有的话)推导函数的返回类型。

以上的唯一解释表明,Clang有一个bug。

但是,由于核心问题1852指定了上述与§8.3.5/2函数相矛盾的dcl.fct,因此应该对其进行修改。该问题的现状已经就绪,这表明这些变化已经被接受。

因此,GCC有一个应该报告的错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24259947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档