尾随返回类型允许在以下两种情况下简化代码:
foo auto X::f() -> foo { /* . */ }之前不需要foo我试图找到标准的相关部分来解释上述两个简化是如何工作的。我看过[basic.lookup]并对trailing-return表示欢迎,但没有找到任何简单的解释上述转换工作方式的方法。
我错过了吗?
trailing-return-type simplifications?标准的哪些部分解释了上面的
发布于 2019-11-22 19:04:53
关于#1,请参见C++17 basic.lookup.qual/3:
在声明者id是限定id的声明中,在声明限定id之前使用的名称将在定义的命名空间范围中查找;在限定id后面的名称将在成员的类或命名空间的范围中查找。
在声明符id之前有一个普通的前导返回类型,即X::f,因此可以在命名空间范围中查找它。尾随返回类型跟随它,因此在类范围中查找它。
对于#2,请注意dcl.decl/4中尾部返回类型的语法是:
->型
根据dcl.fct/2,该类型是函数的返回类型。
如果要使用前导返回类型,则必须由dcl.fct/1递归地确定函数的返回类型:
在声明
T D中,D具有以下形式(parameter-declaration-clause)(参数-子句)cv-限定符-seq(Opt)ref-限定符(Opt)属性-说明符(Opt)属性-seq(Opt)和声明T D1中包含的声明符-id的类型为“派生-声明者-类型-列表T”,D中的声明符-id的类型为“派生--声明者-类型-列表”,其中D中的声明符-id的类型为“派生-声明者-类型-列表-#en0#(Opt)函数-seq(Opt)ref-限定符(Opt)返回T”。
在这里,T表示一个decl-说明符-seq。如果您有一个名为int(*)(int) (例如,FPII )的typedef名称,那么您只需使用它:
FPII g(float);但是,要想做到这一点,我们必须找到T和D1,以便当派生.声明器.类型列表 (即根据D1的语法形式对T施加的类型转换序列)应用于“int返回T函数”时,结果是“float返回指向(D32返回int的函数)的函数”。
如果派生声明器类型列表是“float返回指针到的函数”,而T是int,则可以满足这一要求。因此,声明器D1必须具有*声明符id (float)的语法形式,才能生成所述派生-声明器-类型列表。为了使整个声明中的绑定正确,我们必须添加一个额外的括号。
这里没有从尾部返回类型到前导返回类型的“转换”。相反,尾部返回类型只允许您直接指定返回类型,而前面的返回类型则由这种递归展开声明器的算法来解释。虽然这在“声明遵循使用”的原则下是有意义的,但对于人类来说,要直观地理解它可能有点困难,包括非常有经验的C++程序员。尤其是当我们不得不反向进行时(写下声明,而不是解释现有的声明)。
发布于 2019-10-19 17:55:04
海事组织,你这里有两个无关的问题,我试着回答第一个问题。
扩展到或超过类定义结束的声明的潜在范围也扩展到其成员定义所定义的区域,即使成员是在类之外以词汇方式定义的(这包括静态数据成员定义、嵌套类定义、成员函数定义(包括成员函数体和此类定义的声明器部分的任何部分,其中包括参数-声明-子句和任何默认参数(dcl.fct.default) )。
在成员函数的类外定义中
auto X::f() -> foo { /* ... */ }尾-返回类型遵循声明器-id X::f,因此它是类成员的潜在范围,因此当提到X::foo时,不限定查找会查找foo。
https://stackoverflow.com/questions/58464665
复制相似问题