16

示例(编译良好)

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

};

问题

如果我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'

this不允许在 decltype 中使用吗?有人可以帮助我了解问题所在吗?

编辑

这已作为错误提交

4

2 回答 2

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;
  }
};

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

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

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

(第 4 条)否则,如果成员声明符声明类 X 的非静态数据成员(9.2),则表达式 this 是可选大括号或等式初始化器中“指向 X”的类型的纯右值。它不应出现在成员声明符的其他位置。

(第 5 条)this的表达不得出现在任何其他上下文中。[...]

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

于 2012-06-19T02:33:11.790 回答
1

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

于 2012-06-18T23:55:36.770 回答