Отличие синтаксиса в объявлении массива в качестве поля класса

Решал задачу и мельком обнаружил вот такой занятый синтаксис, обозначающий массив:

template<class T>
class vec
{
    T el[];
    //...
};

При чем такой синтаксис прокатывает лишь в структурах и классах, если попробовать объявить массив таким способом вне их(без задания статического размера в квадратных скобках), то компилятор благополучно пошлет далеко и надолго. Так вот вопрос: чем подобный синтаксис отличается от привычного T* el?


Ответы (1 шт):

Автор решения: HolyBlackCat

Это называется flexible array member, и работает только в С, не в С++, и только если это последнее и не единственное поле в структуре.

Если ваш компилятор это принимает, стоит подкрутить настройки.

Это не указатель, а как бы массив нулевого размера (в лоб T el[0]; - не компилируется). Идея в том, чтобы выделить под структуру память с запасом, а потом размещать в этом запасе элементы массива (произвольное количество), и обращаться к ним через этот псевдо-массив.

По сути, эта фича сама по себе ничего не делает, только упрощает обращение к элементам. Можно было бы с тем же успехом вычислять указатели на них самому.

→ Ссылка