2016-09-06 72 views
18

我有编译器不同意sizeof。对于下面的代码,Clang和GCC将编译它,但是我必须使用的其他编译器失败,声称“非法sizeof操作数”。我对标准的阅读说这是非法的,因为sizeof只能表达一个表达式(我不认为S :: a是表达式)或类型id,但是对于GCC和Clang都是错误的。我明显可以用sizeof(S().a)代替它,它可以与我的所有编译器一起工作。Clang和GCC接受可疑​​的sizeof

struct S 
{ 
    int a[32]; 
    int b; 
    int c; 
    int d[32]; 
}; 

int main() 
{ 
    return sizeof(S::a); 
} 

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

+7

介绍的VS2015也接受它:)你也可以请指定“其他compi lers“和相应的gcc/clang版本? – Rakete1111

+5

[This is added in C++ 11](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html) – Praetorian

+0

无法重现-g ++ 5.2.1,在Ubuntu 15.10上使用clang ++ 3.6.2.1 –

回答

26

§5.1.1 [expr.prim.general] 13

一个ID表达式表示只能用于一类的非静态数据成员或非静态成员函数:

- 作为类成员访问(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在对这个问题本身的评论中指出:这是在C++11

相关问题