C++ 结构中联合的常量成员的问题

C++ 结构中联合的常量成员的问题,c++,C++,在API调用中将结构的某些部分传递给第三方时,我想将其声明为const。我计划通过使用C风格的强制转换丢弃常量来填充这些值。这允许我设置它们,但API的用户知道这些是输入值,因为它们无法轻松设置 把它简化为一个简单的例子,我有 struct mystruct { union valuesUnion { const int32_t integer; const double real; valuesUnion() : integer(0), real(0.0) {}

在API调用中将结构的某些部分传递给第三方时,我想将其声明为const。我计划通过使用C风格的强制转换丢弃常量来填充这些值。这允许我设置它们,但API的用户知道这些是输入值,因为它们无法轻松设置

把它简化为一个简单的例子,我有

struct mystruct
{
  union valuesUnion
  {
    const int32_t integer;
    const double real;
    valuesUnion() : integer(0), real(0.0) {}
  } values;
  mystruct() : values(valuesUnion())
  {
  }
};

int main()
{
  mystruct a;
}
请注意,我必须为“mystruct”添加一个构造函数,否则会由于未初始化的常量变量而导致编译错误

但我犯了个错误-

g++Z.cpp-oz Z.cpp:在构造函数–mystruct::valuesUnion::valuesUnion()中–中: Z.cpp:11:5:error:mystruct::valuesUnion的多个成员的初始化 make:[Z]错误1

如果我将union构造函数更改为-

valuesUnion() : integer(0) {}
然后,我没有从g++获得错误,但它无法在Visual Studio 2012上编译-

valuesUnion::real”:必须在构造函数基/成员初始值设定项列表中初始化

我走错方向了吗


谢谢。

Union与class或struct不同,因为两个“属性”引用相同的内存单元。 只有在对同一内存区域进行两次初始化后,才能初始化此内存

如果你改变

union valuesUnion
为了


然后,您可以检查您的初始化列表是否适合不同的内存区域。

是否有任何理由不使
联合
本身
常量
?“我计划通过使用C样式转换丢弃常量来填充值。”-给出未定义的行为。我不会这么做。为什么你会想要一个常数有两种不同的类型,存储在同一个内存区域?迈克,我意识到C风格的cast不能与GNU编译器一起工作,所以现在使用const_cast,现在我知道如何使用它了!伦丁——它们不是真正的常数。我正在设置值,然后将整个结构传递给另一个库开发人员。他们可以在struct值中设置一些我将要读回的项,但我不希望他们设置只能对其读取的项。“我没有想到这点。”彼得斯在这种情况下,你应该只使用一个初始值设定项。整数(0)将所有并集位设置为0,然后将并集作为双精度查询时得到0.0。不需要双(0.0)初始值设定项。啊-但请再次检查我的问题。最后,我解释说,如果不初始化所有VS 2012,那么在VS 2012上编译将生成另一个错误!我现在有了答案——把联盟标记为const。它是作为评论给我的,所以我不能将它标记为已回答。
struct valuesUnion