【问题标题】:a point from ISO document: based on Anonymous UnionsISO 文件中的一点:基于匿名联盟
【发布时间】:2011-06-22 05:48:39
【问题描述】:

来自 ISO C++ 标准:第 9.5 节,第 4 段,第 1 行:

      "A union for which objects or pointers are declared is not
       an anonymous union."

例子:

 struct X {
        union {
               int i;
               double d;
             } ;
        int f () { return i;}      
       };
   int main() { return 0; }

根据上述观点,我期待此示例出现错误

但是 GCC、SUN 编译器 CC、EDG 等没有显示错误

我期待这个错误//错误:无法直接访问“i”

请..conform上面的例子程序是正确的是错误的

【问题讨论】:

    标签: c++ class c++11 unions


    【解决方案1】:

    这将使联合不是匿名的:

    struct X {
        union {
            int i;
            double d;
        } *p;
        int f () { return i;}      // !Nyet.
    };
    

    干杯,

    【讨论】:

      【解决方案2】:

      为了补充 Alf 所说的,C++ 规范中匿名联合语言的目的是允许对联合成员进行范围界定。如果你在结构中有一个命名联合:

      struct X {
          union {
              int i;
              double d;
          } varname;
      };
      

      i 不是结构 X 的成员。ivarname 的成员,它本身是结构 X 的成员。

      但是,如果联合没有声明成员变量,则必须将 i 作为 X 的成员直接访问。这只有在联合没有名称时才有效(联合定义中没有声明变量)。这种联合称为“匿名联合”。

      【讨论】:

        猜你喜欢
        • 2019-05-02
        • 2021-10-21
        • 1970-01-01
        • 2011-07-07
        • 2010-09-26
        • 1970-01-01
        • 2018-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多