在decltype中使用this指针

Jes*_*ood 16 c++ gcc decltype c++11

示例(编译好)

struct A
{
    void f() {};
    auto g() -> decltype(f())
    {}

};
Run Code Online (Sandbox Code Playgroud)

如果我this在decltype(ie decltype(this->f()))中添加指针,我会用gcc 4.7.0获得以下编译错误:

error: invalid use of incomplete type 'struct A'
error: forward declaration of 'struct A'
error: invalid use of incomplete type 'struct A'
error: forward declaration of 'struct A'
Run Code Online (Sandbox Code Playgroud)

是否this允许在decltype中使用?有人能帮我理解是什么问题吗?

编辑

这是作为一个错误提交的.

jog*_*pan 12

似乎问题不是this出现在a内部decltype,而是出现在函数体外部.

对于例如,下面的代码下面GCC 4.7编译下:

struct A
{
  int f() { return 0; }
  auto g() -> decltype(f()) {
    decltype(this->f()) var = this->f();
    return var;
  }
};
Run Code Online (Sandbox Code Playgroud)

decltype(this->f()) body的内部使用g,但是auto .... -> ....表单中函数的返回类型的规范,即所谓的尾随返回类型规范,不是函数体的一部分,GCC不允许它在那里.

但是,看起来(参见评论中的讨论)C++标准实际上并不需要this在函数体中使用:标准状态的第5.1.1节this可以在可选的const/volatile限定符和结尾之间的任何地方使用功能机构,见下文第3条.(为了完整起见,我还添加了第4条,其中涉及数据成员,与问题没有直接关系).

(第3)如果一个声明声明一个类X的成员函数或成员函数模板,表达 是类型的可选CV-限定符-SEQ和的端部之间的prvalue"指针CV-合格音响ER-SEQ X"函数定义,成员声明者或声明者.它不应出现在可选的cv-quali-seq之前 ,它不应出现在静态成员函数的声明中(尽管它的类型和值类别是在静态成员函数中定义的,因为它们在非静态成员函数中) .[...]

(第4条)否则,如果member-declarator声明类X 的非静态数据成员(9.2),则表达式是可选的brace-or-equal-initializer中的 "指向X的指针"的prvalue .它不应出现在成员声明者的其他地方.

(第5章)中的表达不应出现在任何其他上下文.[...]

注意:可选的cv-qualifier-seq,即函数的constor或volatile限定符必须像Jesse在注释中指出的那样出现尾随返回类型声明之前.因此this,以问题中描述的方式使用应该是正确的,并且GCC似乎是错误的.

  • 如果你真的想要显式,你也可以使用`std :: declval <A>().foo()`,因为它的参数可以是不完整的类型. (2认同)
  • 谢谢这很有帮助.但是,除非我的解释是错误的,否则尾随的返回类型不会出现在*cv-qualifier-seq之后? (2认同)