gpt4 book ai didi

c++ - 引用使用 Union

转载 作者:可可西里 更新时间:2023-11-01 18:08:49 31 4
gpt4 key购买 nike

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

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

我相信这段代码清晰、可读、明确,并且提供了一种方便的方式来存储可以转移到其他内容的引用。它提供了易于理解的语法糖,在提高可读性的同时不影响性能。然而,当我尝试在 visual studio 15 中使用这样的代码时,由于“double& 类型的非法 union 成员”,代码无法编译。

  1. 此代码在标准下是非法的,还是在 Visual Studio 2015 下非法?
  2. 我能否使其在 Visual Studio 2015 中编译,或提交错误报告/更改请求/其他内容?
  3. 以这种方式使用 union 是不好的做法吗?

注意:在我的工作中,几乎所有代码都是为 Linux 编写并使用 GCC 编译的,对于我的特定项目,C++11 是有保证的,GCC 是唯一将要使用的编译器。

编辑:请不要告诉我在 union 中放置引用“没有意义”。当引用存储在结构中时,它占用的空间量与指针相同。此外,以下使用 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;
}
};

为什么当引用包含在匿名结构中时它可以编译,但当它只是在 union 中时却不能?

live example

最佳答案

除了@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

关于c++ - 引用使用 Union,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38691282/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com