在函数定义的上下文中,参数的类型或函数定义的返回类型不得为不完整或抽象(可能具有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,也不包括函数的声明符,但是,每个编译器都说可以。什么措辞可以做到这一点,因为我找不到它?
答案 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
的返回类型),并且由于};
类而失败-尚未结束。