【发布时间】:2019-08-23 18:34:37
【问题描述】:
[dcl.fct.def] p2 状态:
除非函数被删除,否则函数定义的参数类型或返回类型在函数定义的上下文中不得是不完整的或抽象的(可能是 cv 限定的)类类型。
[class.mem] p7 表示:
类在类说明符的结尾
}处被视为完全定义的对象类型(或完整类型)。该类在其完整类上下文中被认为是完整的;否则在它自己的类member-specification中被认为是不完整的。
鉴于此代码:
struct S
{
// S is incomplete
S f() { /* S is complete in a function body */ return S(); }
// S is incomplete
};
// S is complete
A complete-class context 尤其不包括函数定义的 decl-specifier-seq ,也不包括函数的声明符,但是,每个编译器都说这是可以的。什么措辞允许这样做,因为我找不到它?
【问题讨论】:
-
我认为“该类在其完整类上下文中被视为完整”的含义很清楚。
-
@NeilButterworth 如果您查看完整类上下文的定义eel.is/c++draft/class#mem-6,仅包含函数体。
-
@NeilButterworth 但在complete-class contexts 中不包括函数定义,它包含 decl-specifier-seq
-
而在这个code snippet
S又是不完整的:) 对我来说似乎是一个疏忽,S在返回类型中应该是不完整的,除非像你一样直接使用它。跨度> -
@KrystianS 当前对完整类上下文的定义已经很麻烦了,因为不清楚如何处理自引用
noexcepts。见stackoverflow.com/a/54767417/9585016 和CWG361。
标签: c++ language-lawyer