在 decltype 中使用 this 指针

Using the this pointer inside decltype

本文关键字:this 指针 decltype      更新时间:2023-10-16

示例(编译正常)

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出现在decltype内部,而是它出现在函数体之外。

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

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

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

但是,看起来(请参阅评论中的讨论)C++标准实际上并不要求在函数体中使用this:标准的§5.1.1规定,this可以在可选的常量/可变限定符和函数体末尾之间的任何地方使用,请参阅下面的第3条。(为了完整起见,我还添加了第 4 条,该条款涉及数据成员,与问题没有直接关系)。

(第3条)如果声明声明了类X的成员函数或成员函数模板,则表达式为this 是可选的 cv-qualifer-seq 和 函数定义、成员声明符或声明符。它不应出现在可选的 cv 限定符-seq 之前 并且它不应出现在静态成员函数的声明中(尽管它的类型和值 类别在静态成员函数中定义,因为它们在非静态成员函数中定义)。[...]

(条款 4)否则,如果成员声明符声明了类 X 的非静态数据成员 (9.2),则表达式为 this 是可选大括号或等于初始值设定项中类型为"指向 X 的指针"的 prvalue。它不应出现在其他地方 在成员声明符中。

(第5条)"这句话"的表述不得出现在任何其他上下文中。[...]

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

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