引用不完整类型

K-b*_*llo 3 c++ language-lawyer

根据C++ 03标准,引用不完整类型是否有效?我不知道任何实现引用的实现都是非空指针以外的任何实现,所以这样的代码应该工作.但是,我想知道对不完整类型的引用是否符合标准.

我很感激引用答案和引用C++标准.

In *_*ico 6

据我所知,C++标准没有明确说明你可以引用一个不完整的类型.但是标准确实有一个部分指定何时必须完成一个类型:

3.2一个定义规则[basic.def.odr]

4.如果以需要类类型完整的方式使用类,则在翻译单元中需要一个类的正确定义.[ 示例:以下完整的翻译单元格式正确,即使它从未定义X:

    struct X;     // declare X as a struct type
    struct X* x1; // use X in pointer formation
    X* x2;        // use X in pointer formation
Run Code Online (Sandbox Code Playgroud)

-end example ] [ 注意:声明和表达式的规则描述了在哪些上下文中需要完整的类类型.在以下情况下,类类型T必须完整:

  • T定义了一个类型的对象(3.1,5.3.4),或
  • 左值到右值的转换应用于引用类型T(4.1)的对象的左值,或
  • 表达式(隐式或显式)转换为类型T(第4,5.2.3,5.2.7,5.2.9,5.4),或者
  • 表达式不是空指针常量,并且具有非void *转换为类型指针的类型,T或者引用T使用隐式转换(第4节),a dynamic_cast(5.2.7)或a static_cast(5.2.9),或者
  • 类成员访问运算符应用于类型T(5.2.5)的表达式 ,或
  • typeid操作者(5.2.8)或sizeof运营商(5.3.3)被施加到类型的操作数T,或
  • 返回类型或参数类型类型的T函数定义为(3.1)或调用(5.2.2),或
  • 类型的左值T被分配给(5.17).]

似乎在所有其他情况下,包括对不完整类型的引用的声明,类型可能是不完整的.


Set*_*gie 5

§15.1.3说

throw-expression的类型不应是不完整类型,也不应是指向不完整类型的指针或引用,而不是void*,const void*,volatile void*或const volatile void*.

这似乎暗示您可以引用不完整的类型.

我还不太擅长解释标准,所以请按照你的意愿行事.