g++
允许可变长度数组(VLA)作为扩展名。 sizeof
运算符对VLA的结果很有意思:
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
overloaded吗?
答案 0 :(得分:4)
VDA是对sizeof
的操作数未评估的规则的例外,如C99,6.5.3.4/2中所述:
如果操作数的类型是可变长度数组类型,则计算操作数;否则,不评估操作数,结果是整数常量。
此行为是g ++扩展;在标准C ++(直到并包括C ++ 14)中,sizeof
的操作数永远不会被评估(并且不允许使用VLA)。
答案 1 :(得分:4)
sizeof(vla)
不是编译时常量,但会考虑数组的运行时大小。
gcc/g++
允许非C99代码中的VLA作为扩展。这样做时,编译器遵循C99语义。这就是你所观察到的。
答案 2 :(得分:3)
可变长度数组是C99的一部分,它不在C ++中。 Gcc允许它们作为C ++中的扩展使用来自C99的行为,确实说sizeof
返回数组的实际大小(因此在运行时进行评估)。 The wikipedia article about sizeof对其行为进行了很好的总结。