【发布时间】:2011-09-09 02:38:43
【问题描述】:
根据 C++03 标准,引用不完整类型是否有效?我不知道有任何实现将引用作为非空指针以外的任何实现,所以这样的代码应该可以工作。但是,我想知道对不完整类型的引用是否符合标准。
如果能提供引用和引用 C++ 标准的答案,我将不胜感激。
【问题讨论】:
标签: c++ language-lawyer
根据 C++03 标准,引用不完整类型是否有效?我不知道有任何实现将引用作为非空指针以外的任何实现,所以这样的代码应该可以工作。但是,我想知道对不完整类型的引用是否符合标准。
如果能提供引用和引用 C++ 标准的答案,我将不胜感激。
【问题讨论】:
标签: c++ language-lawyer
据我所知,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—结束示例] [注意:声明和表达式的规则 描述在哪些上下文中需要完整的类类型。一类 如果满足以下条件,则类型
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)。 ]
似乎在所有其他情况下,包括声明对不完整类型的引用,该类型都可能是不完整的。
【讨论】:
§15.1.3 说
throw-expression 的类型不能是不完整的类型,或者 指向不完整类型的指针或引用,除了 void*、const void*、volatile void* 或 const volatile void*。
这似乎暗示您可以引用不完整的类型。
我还不太擅长解释标准,所以随你怎么说吧。
【讨论】: