K-b*_*llo 3 c++ language-lawyer
根据C++ 03标准,引用不完整类型是否有效?我不知道任何实现引用的实现都是非空指针以外的任何实现,所以这样的代码应该工作.但是,我想知道对不完整类型的引用是否符合标准.
我很感激引用答案和引用C++标准.
据我所知,C++标准没有明确说明你可以引用一个不完整的类型.但是标准确实有一个部分指定何时必须完成一个类型:
3.2一个定义规则[basic.def.odr]
4.如果以需要类类型完整的方式使用类,则在翻译单元中需要一个类的正确定义.[ 示例:以下完整的翻译单元格式正确,即使它从未定义
X:Run Code Online (Sandbox Code Playgroud)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节),adynamic_cast(5.2.7)或astatic_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*.
这似乎暗示您可以引用不完整的类型.
我还不太擅长解释标准,所以请按照你的意愿行事.
| 归档时间: |
|
| 查看次数: |
1953 次 |
| 最近记录: |