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

Incomplete types in member function definitions

本文关键字:类型 函数 定义 成员      更新时间:2023-10-16

[dcl.fct.def] p2 状态:

参数的类型或函数定义的

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

[class.mem] p7 指出:

类说明符的结束}被视为完全定义的对象类型(或完整类型)。该类在其完整类上下文中被视为完整;否则,它在其自己的类成员规范中被视为不完整。

给定此代码:

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

一个完整的类上下文显然不包括函数定义的 decl-specifier-seq,也不包括函数的声明符,但是,每个编译器都说这是可以的。什么措辞允许这样做,因为我找不到它?

引用链接中的第一项:

的完整类上下文是

  • 函数体 ([dcl.fct.def.general]),

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

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

在分析f的函数体时,首先分析了S类并认为它是完整的,因为它定义了成员函数(函数boby在那里,稍后会分析)。

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


但它是他的另一个案例:

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

编译器希望通过decltype查找S的类型,以便查看令牌(返回类型f)并失败,因为尚未到达};类结束。