Clang和GCC接受可疑​​的大小

Gra*_*rak 18 c++ c++11

我有编译器对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);
}
Run Code Online (Sandbox Code Playgroud)

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

kfs*_*one 26

§5.1.1[expr.prim.general] 13

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

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

- 形成指向成员(5.3.1)的指针,或

- 如果该id-expression表示非静态数据成员,并且它出现在未评估的操作数中 [示例:

struct S {
    int m;
};

int i = sizeof(S::m);      // OK
int j = sizeof(S::m + 42); // OK
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]

编辑:正如@Praetorian在对问题本身的评论中指出:这是在C++ 11中引入的