在decltype中使用this指针

时间:2012-06-18 23:42:28

标签: c++ gcc c++11 decltype

示例(编译正常)

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

};

问题

如果我在decltype中添加this指针(即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'

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

修改

This has been filed as a bug

2 个答案:

答案 0 :(得分:12)

问题似乎不是this出现在decltype内,而是在功能体外显示

对于示例,以下代码在GCC 4.7下编译:

struct A
{
  int f() { return 0; }
  auto g() -> decltype(f()) {
    decltype(this->f()) var = this->f();
    return var;
  }
};

这使用decltype(this->f())内部的g auto .... -> ....,但是this形式的函数返回类型的规范,即称为尾随返回类型规范,不是函数体的一部分,GCC不允许它在那里。

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

  

(第3条)如果声明声明了类X的成员函数或成员函数模板,则表达式 this   是可选的cv-qualifer-seq和结尾之间的“指向cv-quali fi er-seq X的指针”的prvalue   function-de fi nition,member-declarator或declarator。 它不会出现在可选的cv-quali fi-seq 之前   它不应出现在静态成员函数的声明中(尽管它的类型和值   类别在静态成员函数中定义,因为它们在非静态成员函数内)。 [...]

     

(第4条)否则,如果成员声明符声明了类X的非静态数据成员(9.2),则表达式为   是可选的括号或等于初始化程序中“指向X”类型的prvalue。它不会出现在别处   在member-declarator中。

     

(第5条)表达 this 不得出现在任何其他情况中。 [...]

注意:可选的cv-qualifier-seq ,即该功能的volatilethis限定符必须像Jesse在评论中指出的那样显示 之前尾随返回类型声明。因此,以问题中描述的方式使用{{1}}应该是正确的,并且 GCC似乎是错误的。

答案 1 :(得分:1)

错误消息似乎很清楚:'this'是'struct A'的一个实例,它是一个不完整的类型(即编译器在当前传递期间尚未完成解析结构)。