g++似乎接受auto和decltype(auto)的任何组合作为初始和尾部返回类型:
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拒绝j和k,并说:错误:带有尾部返回类型的函数必须指定返回类型'auto',而不是'decltype(auto)‘(游行示威)。
哪个编译器是正确的?在每种情况下都应该使用哪种规则(auto或decltype(auto))?在尾部返回类型中使用占位符类型有意义吗?
发布于 2014-06-17 10:03:00
在@Xeo建设性意见后编辑:
这个问题似乎是由于标准草案的两个地方之间的矛盾。
根据草案标准§7.1.6.4自动说明符dcl.spec.auto
1auto和decltype(auto)类型说明符指定一个占位符类型,该类型将在稍后被替换,或者从初始化项中扣除,或者通过显式规范来替换,并带有尾随返回类型。自动类型说明符也用来表示lambda是泛型lambda。 占位符类型可以与函数声明符一起出现在decl-说明符-seq、类型说明符-seq、转换-函数id或trailing-return-type,中,在此类声明符有效的任何上下文中。如果函数声明器包含一个尾部返回类型(8.3.5),则指定函数的声明返回类型。如果函数的声明返回类型包含占位符类型,则从函数正文中的返回语句(如果有的话)推导函数的返回类型。
以上的唯一解释表明,Clang有一个bug。
但是,由于核心问题1852指定了上述与§8.3.5/2函数相矛盾的dcl.fct,因此应该对其进行修改。该问题的现状已经就绪,这表明这些变化已经被接受。
因此,GCC有一个应该报告的错误。
https://stackoverflow.com/questions/24259947
复制相似问题