§9.5/8 中可能含糊不清的陈述
Potentially ambiguous statement in §9.5/8
§9.5/9 来自 C++11 标准(强调我的(:
类似工会的阶级是一个工会或以匿名工会作为直接成员的阶级。类似联合的类
X
具有一组变体成员。如果X
是union
,则X
的非静态数据成员不是匿名联合,是X
的变体成员。
粗体部分是不是说,在一个类或工会的类之间,只有当它是一个联合时,它才能有一个不是匿名联合的非静态变体成员?如果是这样,为什么?它在代码中有什么实际区别?
我实际上是在质疑这句话是否意味着"如果X
是一个类似工会的阶级......"。那对我来说是完全有意义的。
无论哪种方式,这个条款在过去几天里一直困扰着我,我希望完全理解它所说的内容。
不,您尝试的澄清是错误的。 这是一个类似工会的 X 类:
struct X
{
int a;
union {
double b;
long c;
};
};
X::a
是非匿名联合的类X
的非静态数据成员。 但它绝对不是变体成员。
联合的所有非静态数据成员都是变体成员。 对于不是联合的类联合类,只有那些嵌套在联合子对象中的类才是变体成员。
我能感受到你的痛苦,查看标准文档需要多年的认知损害,才能正确解析这类东西。
只有当它是一个联合时,它才能有一个不是匿名联合的非静态变体成员?
差一点。
这并不是说只有类似工会的阶级的工会版本才能拥有非静态的等等等等。
它所说的是两者都可以拥有它(从技术上讲,它不是这么说,但它拒绝反驳这种可能性(,但只有联合版本才会将其视为"X 的变体成员"。
似乎最新的公开可用草案(2013-10-13(有一个更精细的定义,引用:
类似工会的类是一个工会或具有匿名工会的类 作为直接成员。类似联合的 X 类有一组变体 成员。如果
X
是联合,则X
的非静态数据成员是 不是匿名工会是X
的变体成员。此外,一个 作为X
成员的匿名联合的非静态数据成员 也是X
的变体成员。工会中最多一个变体成员 可能具有大括号或等于初始值设定项。例:
union U {
int x = 0;
union { };
union {
int z;
int y = 1; // error: initialization for second variant member of U
};
};
至于这个问题,粗体部分实际上是定义了什么是变体成员,一个类似工会的类必须拥有(通过有一个union
作为直接成员(才能成为一个类似工会的类。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 我的神经网络不起作用 [XOR 问题]
- Boost::asio::streambuf consumption() 不清空缓冲区
- 虽然不等于陈述和/或差异
- 为什么编译器在此代码中说POW(N,K)含糊不清
- 为什么我不能以这种方式清空文件?
- 如何清空列表而不破坏其元素
- 我搞不清我的代码出了什么问题
- “距离”的提法含糊不清
- 我是不是太快了,数不清妖孽
- 字符串流缓冲区在 Objective-C++ 中不会清空
- 对'list'的引用含糊不清
- 为什么这个电话含糊不清
- 清空std::矢量而不更改其大小
- 是否可以在不调用包含对象的析构函数的情况下清空映射的内容?
- 在C++中清除数组会在外部函数中而不是在main()中产生编译器错误
- §9.5/8 中可能含糊不清的陈述
- 口齿不清的类
- 对"class"的提及含糊不清
- 在用户定义的类中清空 std::vector 时不释放内存