"константные переменные", установленные конструктором для выражения границ массива C ++? - PullRequest
4 голосов
/ 15 марта 2012

Следующий код компилируется и, кажется, работает нормально:

class Test {
  private:
     const unsigned MAX;

  public:

     Test (const unsigned int n) : MAX(n) { }

     void foo () {
         int array[MAX];
         ...
     }

};

но действительно ли это нормально?Я имею в виду:

Test a (3);
Test b (8);

действительно ли array имеет 3 и 8 ячеек соответственно?

Если так, то потому ли это, что array - это автоматическая переменная и создается с соответствующим измерением?

Спасибо

Ответы [ 3 ]

4 голосов
/ 15 марта 2012

То, что вы написали, действительно в , но не допустимо .

Я, конечно, говорю о том, что вы используете VLA , а не полный фрагмент.


При компиляции с использованием g++ -pedantic -ansi -Wall мы получаем следующее предупреждение;

foo.cpp: In member function 'void Test::foo()':
foo.cpp:18:23: warning: ISO C++ forbids variable length array 'array' [-Wvla]

Как упоминалось в приведенном выше предупреждении, используемый вами шаблон часто называют массивом переменной длины , который стандарт в C99 и "разрешен" в C ++ через расширение g ++.

Я бы порекомендовал вам использовать контейнер STL вместо хаков, как эти, по одной единственной причине; то, что вы делаете, не является законным, и поэтому не гарантируется, что вы будете переносимыми кросс-компиляторами.

4 голосов
/ 15 марта 2012

Массивы переменной длины не являются стандартными C ++. Вместо этого вы можете сделать Test шаблон:

template <int MAX>
class Test {
public:
    Test () {}

    void foo () {
        int array[MAX];
    }
};

Test<4> t4;
Test<8> t8;
1 голос
/ 15 марта 2012

Вы правы, что это не разрешено C ++.Если он работает на вашем компиляторе, возможно, это связано с тем, что вы используете расширение GCC .

...