引用不完整类型

时间:2011-09-09 02:38:44

标签: c++ language-lawyer

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

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

2 个答案:

答案 0 :(得分:6)

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

  

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

     

4. 翻译中只需要一个类的定义   如果以需要类类型的方式使用类,则为unit   完成。 [示例:以下完整的翻译单元是   格式良好,即使它从未定义X

    struct X;     // declare X as a struct type
    struct X* x1; // use X in pointer formation
    X* x2;        // use X in pointer formation
     

-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条),dynamic_cast(5.2.7)   或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)。 ]
  •   

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

答案 1 :(得分:5)

§15.1.3说

  

throw-expression的类型不应该是不完整的类型,或者a   指向或引用不完整的类型,而不是void *,const   void *,volatile void *或const volatile void *。

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

我还不太擅长解释标准,所以请按照你的方式进行。