【问题标题】:References to incomplete types对不完整类型的引用
【发布时间】:2011-09-09 02:38:43
【问题描述】:

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

如果能提供引用和引用 C++ 标准的答案,我将不胜感激。

【问题讨论】:

    标签: c++ language-lawyer


    【解决方案1】:

    据我所知,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)。 ]

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

    【讨论】:

    • 请注意,此列表虽然非常有用,但属于非规范性注释,因此没有指定任何内容。这很有帮助。
    【解决方案2】:

    §15.1.3 说

    throw-expression 的类型不能是不完整的类型,或者 指向不完整类型的指针或引用,除了 void*、const void*、volatile void* 或 const volatile void*。

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

    我还不太擅长解释标准,所以随你怎么说吧。

    【讨论】:

      猜你喜欢
      • 2018-07-23
      • 1970-01-01
      • 2011-05-18
      • 2017-10-09
      • 2011-04-28
      • 2011-07-13
      • 2013-03-11
      相关资源
      最近更新 更多