繁体   English   中英

在decltype中使用this指针

[英]Using the this pointer inside 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出现在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.1认为this可以在可选的常量/ 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 ,即constvolatile限定符,必须像Jesse在注释中指出的那样出现尾随返回类型声明之前。 因此,以问题中描述的方式使用this应该是正确的,并且GCC似乎是错误的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM