当前位置: 首页 > 知识库问答 >
问题:

尾随返回类型中的占位符是否覆盖初始占位符?

阚原
2023-03-14

g似乎接受autodecltype(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拒绝了jk,他说:错误:带有尾部返回类型的函数必须指定返回类型“auto”,而不是“decltype(auto)”(演示)。

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

共有2个答案

通正平
2023-03-14

在@Xeo建设性评论后编辑:

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

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

1auto和decltype(auto)类型说明符指定一个占位符类型,该占位符类型将在以后被替换,可以通过从初始值设定项中进行推断,也可以通过带有尾部返回类型的显式规范。自动类型说明符还用于表示lambda是泛型lambda。

2占位符类型可以与函数声明符一起出现在decl说明符seq、类型说明符seq、转换函数id或尾随返回类型中,在此类声明符有效的任何上下文中。如果函数声明符包含一个尾部返回类型(8.3.5),则指定函数声明的返回类型。如果声明的函数返回类型包含占位符类型,则函数的返回类型将从函数体中的返回语句(如果有)中推导出来。

对上述内容的唯一解释是,Clang有一个bug。

然而,由于核心问题1852规定上述与§8.3.5/2函数[dcl.fct]相矛盾,应该进行更改。问题的状态已准备就绪,表明更改已被接受。

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

斜成济
2023-03-14

引入尾随返回类型时,需要使用auto

§8.3.5[dcl.fct] /2

在声明中,td其中D的形式为

D1(参数声明子句cv限定符seqoptref限定符opt异常规范opt属性说明符seqopt尾部返回类型

并且声明T D1中包含的声明符-id的类型为“派生声明符-type-listT”,

T应为单一类型的自动规范。[...]

关于与[dcl.spec.auto]/1的明显矛盾,另见核心问题1852。

 类似资料:
  • 类型 Glide允许用户指定三种不同类型的占位符,分别在三种不同场景使用: placeholder error fallback 占位符(Placeholder) 占位符是当请求正在执行时被展示的 Drawable 。当请求成功完成时,占位符会被请求到的资源替换。如果被请求的资源是从内存中加载出来的,那么占位符可能根本不会被显示。如果请求失败并且没有设置 error Drawable ,则占位符将

  • #{}速度快,能防止sql注入,是占位符方式,先预编译,然后填充参数,字符串格式,用户名=(___),参数只是下划线上的内容 ${}是直接拼接到语句上,这种方式需要自己拼括号和参数,但是也可以拼接想执行的任何语句,也就是传说中的sql注入 详情如下 在MyBatis中使用参数进行SQL拼装经常会使用到#{var}和${var}两种参数的设置方式。下面是两种方式的不用之处: #{var} 使用预编译

  • 问题内容: 看来这是一个众所周知的问题,但是我在Google上找到的所有解决方案都不适用于我新下载的IE9。 启用and 标签上的属性的最喜欢的方式是哪种? 可选:我为此花了很多时间,而且还没有去寻找房产。您对此还有意见吗?显然,我可以检查PHP中的值,但是对于帮助用户使用此属性非常方便。 问题答案: HTML5占位符jQuery插件 -通过的Mathias Bynens上协作者HTML5样板和j

  • 我有一个使用占位符的Thymeleaf模板,其中占位符属性指定一个简短提示,描述输入字段的预期值或格式。 占位符在输入文本为空时工作。但是,如果需要编辑包含以前输入的数据的字段,则以前输入的文本将消失,并在输入收到焦点时替换为占位符文本。 有没有办法避免这种情况? 胸腺叶模板 以及生成的HTML

  • 问题内容: 看来这是一个众所周知的问题,但是我在Google上找到的所有解决方案都不适用于我新下载的IE9。 启用and 标签上的属性的最喜欢的方式是哪种? 可选:我为此花了很多时间,而且还没有去寻找房产。您对此还有意见吗?显然,我可以检查PHP中的值,但是对于帮助用户使用此属性非常方便。 问题答案: HTML5占位符jQuery插件 -通过的Mathias Bynens和jsPerf https

  • 我有一个Thymeleaf模板,我想把一个对象的属性作为占位符,但是我看到的是。