标准措辞在哪里允许函数声明中的不完整类型,但在函数定义中需要完整的类型?

Lig*_*ica 1 c++ language-lawyer

我最近发现非定义函数声明中的参数类型可能是不完整的类型.这非常令人兴奋.

class A;
class B {
   B(A a);      // Legal! Wow!
};
Run Code Online (Sandbox Code Playgroud)

只有定义时才需要完成类型:

B::B(A a) {};   // error: ‘a’ has incomplete type
Run Code Online (Sandbox Code Playgroud)

我一直在努力确定这方面的法律术语,但我在C++ 11中搜索"[in] complete type"并没有引起太大的兴趣,这使我认为这些语义是通过一个神秘的迷宫来定义的.结构.

在功能声明和定义中,您能否帮我确定定义完整或其他功能参数类型的上述要求的标准文本?

(9.2/10并在类定义中9.4.2/2给出static数据成员声明和非static数据成员定义的要求.)

Joh*_*itb 5

见8.3.5p9,它规定了确切的规则.对于= delete定义,实现可能也会接受不完整的参数类型(追溯性)(由C++委员会在DR决议中确定).

特别是,在非定义函数声明中没有对参数或返回值执行任何操作.将参数复制到参数是在调用者的上下文中完成的.参数的破坏是在被调用者的上下文中,在函数定义中完成的.返回值的销毁是在函数调用中调用者的上下文中完成的,除非调用是a中最顶层逗号运算符的最顶层表达式或右操作数decltype.然后没有发生破坏,因为没有临时创建作为特殊情况(以帮助SFINAE库).