使用Union参考

时间:2016-08-01 04:58:12

标签: c++ c++11 syntax visual-studio-2015 unions

在工作中,我一直在使用Linux和CCC 11和C ++ 14的GCC编译器。在一些工作代码中,我使用了一个联合来存储引用和指针,如下所示:(简化为重要部分)

struct MyStruct
{
    //Stuff
    union { double& x; double* x_ptr; };
    MyStruct(double& value) : x(value) {}
    //More stuff
};

我相信这段代码清晰,可读,明确,并提供了一种方便的方式来存储可以转移到其他东西的引用。它提供易于理解的语法糖,而不会降低性能,同时提高可读性。但是,当我尝试在visual studio 15中使用这样的代码时,由于"类型为double&"的非法联合成员,代码无法编译。

  1. 此代码在标准下是非法的,还是仅在Visual Studio 2015下?
  2. 我可以在Visual Studio 2015中进行编译,还是提交错误报告/更改请求?
  3. 以这种方式使用工会是不好的做法吗?
  4. 注意:在我的工作中,几乎所有代码都是为Linux编写的,并使用GCC编译,对于我的特定项目,C ++ 11是有保证的,而GCC是唯一可以使用的编译器。

    编辑:请不要告诉我在工会中加入参考资料"没有任何意义"。当引用存储在结构中时,它占用与指针相同的空间量。另外,下面用clang编译:

    struct MyStruct
    {
        //This will compile
        union 
        { 
            struct { double& x; }; 
            double* x_ptr; 
        };
        //This won't compile; WHY?
        /*union 
        { 
            double& x;
            double* x_ptr; 
        };*/
        MyStruct(double& val) : x(val){}
        void Repoint(double& new_value) 
        { 
            x_ptr = &new_value; 
        }
    };
    

    为什么在将引用包装在匿名结构中时进行编译,而不是在它只是在联合中时?

    live example

2 个答案:

答案 0 :(得分:10)

除了@Brian: 您可以使用例如编译进行编译。 std::reference_wrapper而不是简单的引用:

#include <functional>

struct MyStruct
{
    //Stuff
    union { std::reference_wrapper<double> x; double* x_ptr; };
    MyStruct(double& value) : x(value) {}
    //More stuff
};

int main()
{
    double value = 123;
    MyStruct myStruct(value);
}

live example

答案 1 :(得分:9)

联盟包含参考成员是非法的。这可能是因为引用不是对象,并且它们是否未指定它们是否占用存储空间 - 因此对于与其他变量共享其存储的引用没有任何意义。

  

union可以具有成员函数(包括构造函数和析构函数),但不具有虚函数(10.3)。   工会不得有基类。联合不得用作基类。如果联合包含非   参考类型的静态数据成员程序格式不正确。

([class.union / 2)