在 clang 和 g++ 中对类成员进行重新排序
Reordering of the class members in clang and g++
程序
#include <iostream>
typedef int T;
struct A
{
typedef char T;
T i;
};
int main(){ }
应该是格式不正确的,因为N4296::3.3.7/5 [basic.scope.class]
:
如果对类中的成员声明重新排序会产生备用有效 (1)和(2)下的程序,程序格式不正确,没有诊断 必填。
但是clang和g++都编译得很好
G++
铛
是他们的错误吗?
如果对类中的成员声明重新排序会产生备用有效 (1) 和 (2) 下的程序,程序格式不正确,否 需要诊断。
尽管由于 CWG 问题 #1875 而删除了这个确切(多余)的项目符号点,但请注意粗体部分;如果我们对声明重新排序
struct A
{
T i;
typedef char T;
};
程序不符合规则 2):
2) 类
S
中使用的名称N
应指同一声明 在其上下文中以及在已完成的S
范围内重新评估时。不 违反此规则需要诊断。
T
用于i
宣言,指的是全球typedef
。但是,当在已完成的 A
范围内重新评估时,T
引用成员 typedef,这显然是一个不同的声明。
但是,您的代码不会违反此规则。
该标准给出了一个例子来显示我的第一个代码段和你的代码片段之间的差异,以及它们的有效性。[basic.scope.class]/5:
typedef char* T;
struct Y {
T a; // error: T refers to ::T
// but when reevaluated is Y::T
typedef long T;
T b;
};
因此,您问题中的代码确实格式良好。
相关文章:
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 数组将排序排序为降序而不是升序
- 如何按姓氏排序并打印新数组
- 将一个数组的每个元素乘以另一个数组的每个元素,并对新的非常大的数组进行排序
- 合并排序 - 返回新数组,而不是将合并的数组复制到输入数组
- 如何对骰子进行排序并创建每个数组中具有相等骰子的新数组,Yahtzee,C++
- 与排序相关的算法(将每个项目替换为排序排序中的索引)
- 如何将未排序数组的排序索引放入新数组中
- "std::"具有排序/排序、存在测试和头/尾访问的数据结构?
- 创建没有重复项的新排序向量
- 使用快速排序排序不会给出排序的数组
- 读取文本行,对它们进行排序并将它们写入新的文本文件