C++ C++;8.3.4p4和x27中的11数组声明示例;不匹配gcc或叮当声?

C++ C++;8.3.4p4和x27中的11数组声明示例;不匹配gcc或叮当声?,c++,c++11,C++,C++11,这是C++11(与最新草案相同)8.3.4p4([dcl.array]/4)中示例的子集: gcc不同意该错误,并给出: error: type mismatch with previous external decl of ‘int x []’ 相反(在声明3中) clang编译时不会出错 我的理解是,这个例子的形式很好。声明3应该链接到声明1和2,因此应该具有类型数组10 int,而不是数组未知绑定int。因此,它应该在sizeof完成 谁是对的?标准gcc或clang?8.3.4/3包括

这是C++11(与最新草案相同)8.3.4p4([dcl.array]/4)中示例的子集:

gcc不同意该错误,并给出:

error: type mismatch with previous external decl of ‘int x []’
相反(在声明3中)

clang编译时不会出错

我的理解是,这个例子的形式很好。声明3应该链接到声明1和2,因此应该具有类型
数组10 int
,而不是
数组未知绑定int
。因此,它应该在sizeof完成

谁是对的?标准gcc或clang?

8.3.4/3包括:

此外,如果在指定绑定的同一范围内存在实体的先前声明,则忽略的数组绑定将被视为与先前声明中的相同

由于函数内的声明与不适用的全局声明不在同一范围内,因此不授予省略数组绑定的权限。我也没有看到任何其他允许省略的文本,因此
sizeof(x)
表达式中的
x
类型不完整

Clang不应接受该代码,gcc出于错误的原因拒绝了该代码,我认为该标准的示例非常准确。

8.3.4/3包括:

此外,如果在指定绑定的同一范围内存在实体的先前声明,则忽略的数组绑定将被视为与先前声明中的相同

由于函数内的声明与不适用的全局声明不在同一范围内,因此不授予省略数组绑定的权限。我也没有看到任何其他允许省略的文本,因此
sizeof(x)
表达式中的
x
类型不完整


Clang不应该接受代码,gcc出于错误的原因拒绝了它,标准的示例在我看来很准确。

可能会添加编译器版本?gcc版本4.7.2(Ubuntu/Linaro 4.7.2-2ubuntu1),Clang版本3.0-6ubuntu3Ok。我用clang 3.4测试了它,它同意失败的大小。也许可以添加编译器版本?gcc版本4.7.2(Ubuntu/Linaro 4.7.2-2ubuntu1),clang版本3.0-6ubuntu3Ok。我用Clang3.4测试了它,它与fail的大小一致。您是否考虑了外部说明符?这将它链接到前两个声明。所有三个声明都引用同一个对象。使用最新版本的gcc和clang进行测试时,错误似乎符合标准。@AndrewTomazos是的,
extern
声明只是重新声明全局定义的数组,因此引用同一个对象,但是,这并不意味着它们在完整类型方面都具有相同的状态。您是否考虑了外部说明符?这将它链接到前两个声明。所有三个声明都引用同一个对象。使用最新版本的gcc和clang进行测试时,错误似乎符合标准。@AndrewTomazos是的,
extern
声明只是重新声明全局定义的数组,因此引用同一个对象,然而,这并不意味着它们在完整类型方面都具有相同的状态。
error: type mismatch with previous external decl of ‘int x []’