类中的可变长度数组部分和C ++中的类模板

时间:2011-12-02 04:42:37

标签: c++

之前我问this question。但现在我想知道为什么以下内容也有效或无效:

class C {
    int n;
    int a[n];
};
template <typename T, int n> class A {
    int a[n];
};

我用g ++测试它们似乎有效。在函数内部,它们是否与VLA相同,或者它们是不同的?此外,我现在可以在堆上制作阵列部件了。

2 个答案:

答案 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
}