Clang 和 GCC 接受有问题的 sizeof

Posted

技术标签:

【中文标题】Clang 和 GCC 接受有问题的 sizeof【英文标题】:Clang and GCC accept questionable sizeof 【发布时间】:2016-09-06 17:33:49 【问题描述】:

我的编译器在 sizeof 上存在分歧。对于以下代码,Clang 和 GCC 将编译它,但我必须使用的其他编译器失败声称“非法 sizeof 操作数”。我对标准的阅读表明这是非法的,因为 sizeof 只能采用表达式(我不认为 S::a 是表达式)或类型 ID,但 GCC 和 Clang 两者都不常见是错的。我显然可以用sizeof(S().a) 替换它,它适用于我所有的编译器。

struct S

   int a[32];
   int b;
   int c;
   int d[32];
;

int main()

   return sizeof(S::a);

是 Clang 和 GCC 错了,还是我误读了标准?

【问题讨论】:

VS2015 也接受 :) 能否也请指定“其他编译器”和相应的 gcc/clang 版本? This was added in C++11 无法重现 - Ubuntu 15.10 上的 g++ 5.2.1、clang++ 3.6.2.1 【参考方案1】:

§ 5.1.1 [expr.prim.general] 13

只能使用表示类的非静态数据成员或非静态成员函数的 id-expression:

——作为类成员访问 (5.2.5) 的一部分,其中对象表达式引用成员的类[63] 或从该类派生的类,或

——形成一个指向成员的指针(5.3.1),或者

——如果该 id 表达式表示一个非静态数据成员并且它出现在一个未计算的操作数中 [例子:

struct S 
    int m;
;

int i = sizeof(S::m);      // OK
int j = sizeof(S::m + 42); // OK

-结束示例]

编辑: 正如@Praetorian 在 cmets 中对问题本身指出的那样:这是在 C++11

中引入的

【讨论】:

以上是关于Clang 和 GCC 接受有问题的 sizeof的主要内容,如果未能解决你的问题,请参考以下文章

为啥在编译期间不使用 GCC 选项 -Os?

编译器 GCC 和 Clang 有什么区别?

GCC 和 clang 上的 MSVC /Zp 替代方案是啥?

你如何为 clang 和 gcc 编写一个 makefile?

mac 使用gcc 为啥编译错误是clang 提示

OS X 上的 LLVM 与 clang