Отличие синтаксиса в объявлении массива в качестве поля класса
Решал задачу и мельком обнаружил вот такой занятый синтаксис, обозначающий массив:
template<class T>
class vec
{
T el[];
//...
};
При чем такой синтаксис прокатывает лишь в структурах и классах, если попробовать объявить массив таким способом вне их(без задания статического размера в квадратных скобках), то компилятор благополучно пошлет далеко и надолго.
Так вот вопрос: чем подобный синтаксис отличается от привычного T* el?
Ответы (1 шт):
Это называется flexible array member, и работает только в С, не в С++, и только если это последнее и не единственное поле в структуре.
Если ваш компилятор это принимает, стоит подкрутить настройки.
Это не указатель, а как бы массив нулевого размера (в лоб T el[0]; - не компилируется). Идея в том, чтобы выделить под структуру память с запасом, а потом размещать в этом запасе элементы массива (произвольное количество), и обращаться к ним через этот псевдо-массив.
По сути, эта фича сама по себе ничего не делает, только упрощает обращение к элементам. Можно было бы с тем же успехом вычислять указатели на них самому.