根据C ++ 03标准,引用不完整类型是否有效?我不知道任何实现引用的实现都是非空指针以外的任何实现,所以这样的代码应该工作。但是,我想知道对不完整类型的引用是否符合标准。
我很感激引用和引用C ++标准的答案。
答案 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 *。
这似乎暗示您可以引用不完整的类型。
我还不太擅长解释标准,所以请按照你的方式进行。