g++
允许可变长度数组(VLA)作为扩展。sizeof
算子在VLAs上的结果很有趣:
int main ()
{
char size = 20, a[10], b[size];
cout<<"sizeof(a) = "<<sizeof(a)<<endl; // sizeof(a) = 10, (can be used as template param)
cout<<"sizeof(b) = "<<sizeof(b)<<endl; // sizeof(b) = 20 !! (can't used be as template param)
}
在sizeof(b)
的情况下,g++是否不遵循sizeof
仅在编译时评估的标准?sizeof
过载了吗?
vla是不计算sizeof
操作数规则的例外,如C99, 6.5.3.4/2:
如果操作数的类型是可变长度数组类型,则计算该操作数;否则,操作数并不是评估,结果是一个整数常数。
这个行为是一个c++扩展;在标准c++(包括c++ 14)中,sizeof
的操作数永远不会被求值(并且不允许使用vla)。
vla是在1999年引入的。在C99中,sizeof(vla)
不是编译时常量,但考虑了数组的运行时大小。
gcc/g++
允许vla在非c99代码中作为扩展。当这样做时,编译器遵循C99语义。
可变长度数组是C99的一部分,不在c++中。Gcc允许它们在c++中使用C99的行为作为扩展,C99确实说sizeof
返回数组的实际大小(因此在运行时计算)。维基百科关于sizeof的文章很好地总结了它的行为。