gpt4 book ai didi

c++ - iso 12.1 p5 中的第 4 个要点对我来说没有意义

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:10 26 4
gpt4 key购买 nike

也许我遗漏了什么,但 IMO iso §12.1 p5 中的第 4 个要点是错误的:

X is a union and all of its variant members are of const-qualified type (or array thereof),

仅仅是因为在一个 union 中不能有超过一个 const 合格成员。

从 §9.1 我们有:

In a union, at most one of the non-static data members can be active at any time, that is, the value of at most one of the non-static data members can be stored in a union at any time.

编辑:

此代码段未在 Ideone 中编译

union U
{
const int i;
const char c;
float x;
U(int j, char a) : i(j), c(a) {}
};

编辑1:

以下代码在 Coliru 和 Ideone 中编译.但是根据 12.1 p5 第 4 个要点,它不应该作为默认构造函数删除。

#include <iostream>
union T
{
const int y;
const int x;
const float z;
T(int j) : y(j) {}
T() = default;
};

int main()
{
T t;
}

编辑2:

我也不明白为什么标准不允许这种代码(参见 9.5 p2 中的注释)

struct S
{
int i;
S() : i(1) {}
};

union T
{
S s;
char c;
};

int main()
{
T t;
}

但允许这样做。有什么区别?

struct S
{
int i;
S() : i(1) {}
};

union T
{
S s;
char c;
T() {}
};

int main()
{
T t;
}

最佳答案

§12.1/5 完全有效:它只是说如果所有成员都是 const,则不可能生成默认构造函数,因为那样就没有成员可以保留未初始化。

§9.1 没有提到限制constness。这是一段关于访问 union 成员的的限制,这是完全不相关的。

这里只有一个成员“活跃”意味着只能以任意顺序写入和读取一个成员。一旦您写信给另一个成员,您就只能从那个成员那里读到。

这是一个示例,以及一个演示示例的 union 声明是有效的:

union T
{
int x;
const int y;
const int z;
};

int main()
{
T a{4};
a.x = 5;
a.y = 6;
a.z = 7;
}

// $ g++-4.8 -std=c++11 -Wall -pedantic -pthread main.cpp && ./a.out
// main.cpp: In function 'int main()':
// main.cpp:14:9: error: assignment of read-only member 'T::y'
// a.y = 6;
// ^
// main.cpp:15:9: error: assignment of read-only member 'T::z'
// a.z = 7;
// ^

Live demo

因为编译成功直到尝试分配 T::y


编辑:您现在粘贴的代码,以及您提示的错误消息,const 无关>.

initializations for multiple members of ‘U’

那是你的问题。就在那儿这么说!尝试初始化 union 的两个成员是没有意义的,因为在任何给定时间只有一个可能是“事件的”:

[C++11: 12.6.2/8]: [..] An attempt to initialize more than one non-static data member of a union renders the program ill-formed. [..]

但这与constness 完全无关。

关于c++ - iso 12.1 p5 中的第 4 个要点对我来说没有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20806185/

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