之前我问this question。但现在我想知道为什么以下内容也有效或无效:
class C {
int n;
int a[n];
};
template <typename T, int n> class A {
int a[n];
};
我用g ++测试它们似乎有效。在函数内部,它们是否与VLA相同,或者它们是不同的?此外,我现在可以在堆上制作阵列部件了。
答案 0 :(得分:2)
VLA的大小在运行时确定。即使g++
实现了VLA,VDA也不在C ++中。
由于模板是编译时机制,因此数组A::a
的大小将在编译时确定。但是,数组C::a
无效,因为c::n
不是编译时常量。
尝试使用-std=c++98
或-std=c++0x
启用警告进行编译。
答案 1 :(得分:1)
n
不变,否则 1st无效。如果允许,sizeof
将无法正常工作。
第二。并不是真正的VLA,因为n
必须是不变的:
void foo(int n) {
A<int, n> x; // error
}
如果您想要半便携式VLA,请使用alloca
功能。或者使用std :: vector,如果你不关心它在堆上。
void foo(int n) {
int a[n]; // VLA extension, somewhat portable
int* b = alloca(n * sizeof(int)); // alloca, somewhat portable (should work on MSVC)
std::vector<int> c(n); // portable
}