成员函数定义中的类型不完整

时间:2019-08-23 18:34:37

标签: c++ language-lawyer

[dcl.fct.def] p2状态:

  

在函数定义的上下文中,参数的类型或函数定义的返回类型不得为不完整或抽象(可能具有cv限定)的类类型,除非删除该函数。

然后[class.mem] p7指出:

  

class-specifier 的结尾}处,一个类被视为完全定义的对象类型(或完整类型)。该类在其完整类上下文中被视为完整类;否则,在其自身的成员规范类中将其视为不完整。

给出以下代码:

struct S
{
  // S is incomplete
  S f() {  /* S is complete in a function body */ return S(); }
  // S is incomplete 
};
// S is complete

complete-class context显然不包括函数定义的decl-specifier-seq,也不包括函数的声明符,但是,每个编译器都说可以。什么措辞可以做到这一点,因为我找不到它?

2 个答案:

答案 0 :(得分:3)

所指链接的第一项:

  

一个类的完整类上下文是

     
      
  • 功能主体([dcl.fct.def.general]),
  •   

因此,在任何方法的函数体内都被视为完整类上下文。据我所知,“函数定义的上下文”与函数主体同义-与函数声明的上下文相反,在函数声明的上下文中,不需要完整的返回类型。

答案 1 :(得分:0)

我认为编译器首先找到令牌lex.phases 1.7 S类(声明了其所有成员)和f成员函数(仅声明,其中包括返回类型)。然后,对它们进行分析。

在分析f的功能体时,首先分析了S类,并认为它是完整的,因为它定义了成员函数(函数boby在其中,将被分析稍后)。

现在S已完成,f可以使用return S()


但这是他的另一种情况:

struct S {
    decltype(S{}) f() { return S(); }
};

编译器希望通过S查找decltype的类型,以便考虑令牌(f的返回类型),并且由于};类而失败-尚未结束。