成员函数定义中的类型不完整
Incomplete types in member function definitions
[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
)并失败,因为尚未到达};
类结束。
相关文章:
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 使用SFINAE来检测void返回类型函数的存在
- 使用此类型函数有什么优势
- 为什么此函数通过类型函数指针调用后,呼叫明智地行为
- 如何使用无类型函数指针调用C++成员函数
- 模板返回类型函数如何在C++中工作
- 具有通用类型函数的动态库[C ]
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- 对于需要其他模板参数的类型函数的部分模板专业化
- c++错误的参数类型-函数指针
- 延迟评估模板类型函数
- 在引用或指针返回类型函数上输入
- 具有指针数据类型的非类型函数模板参数
- STL中使用的C++自定义比较类型(函数谓词与较少结构)
- C++模板基类的非类型函数模板的 using 声明
- 字符串到类型函数,模板专用化使调用统一
- 自由类型函数可以接受 Unicode 文件名吗?