在工作中,我一直在使用Linux和GCC编译器进行C++11和C++14的开发。在某些需要存储引用和指针的代码中,我使用了一个联合体(union)来实现,代码如下所示:(只展示重要部分)
struct MyStruct
{
//Stuff
union { double& x; double* x_ptr; };
MyStruct(double& value) : x(value) {}
//More stuff
};
我认为这段代码很清晰、易读、明确,并提供了一种方便的方法来存储可以转移到其他内容的引用。它提供易于理解的语法糖,不会影响性能,同时提高可读性。然而,当我尝试在Visual Studio 15中使用此类代码时,由于“双重&”类型的非法联合成员,代码无法编译。
- 这段代码是按照标准非法的,还是只是在Visual Studio 2015下非法的?
- 我可以让它在Visual Studio 2015中编译,还是需要提交错误报告/更改请求/其他什么东西?
- 在那种情况下使用联合是否是坏实践?
编辑:请不要告诉我在联合内放置一个引用“没有意义”。当引用存储在结构体内时,它占用与指针相同的空间。此外,以下代码在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;
}
};
为什么当引用包装在匿名结构体中时,代码能够编译通过,但当它只是在联合体中时就不能? 实际示例