Структурный эквивалент взлома в C ++

Хак с структурой, где у вас есть массив длины 0 в качестве последнего члена структуры из C90 и C99, хорошо известен, и с введением гибких членов массива в C99 мы даже получили стандартизированный способ его использования с[], К сожалению, C ++ не предоставляет такой конструкции, и (по крайней мере, с Clang3,4), компилируя структуру с[0] или же[] выдаст предупреждение компиляции с--std=c++11 -pedantic:

$ cat test.cpp 
struct hack {
  char filler;
  int things[0];
};
$ clang++ --std=c++11 -pedantic test.cpp
\test.cpp:3:14: warning: zero size arrays are an extension [-Wzero-length-array]
  int things[0];

и аналогично

$ cat test.cpp 
struct fam {
  char filler;
  int things[];
};
$ clang++ --std=c++11 -pedantic test.cpp
\test.cpp:3:7: warning: flexible array members are a C99 feature [-Wc99-extensions]
  int things[];

Мой вопрос тогда такой: скажем, что я хочу иметь структуру, которая содержит массив переменного размера в качестве последнего элемента в C ++. Как правильно поступить с компилятором, который поддерживает оба? Должен ли я пойти с взломать структуру[0] (который является расширением компилятора), или FAM[] (что является функцией C99)? Насколько я понимаю, либо сработает, но я пытаюсь выяснить, что является меньшим злом?

Кроме того, прежде чем люди начнут предлагать сохранитьint* вместо этого выделенному фрагменту памяти в структуре, это не является удовлетворительным ответом. Я хочу выделить один фрагмент памяти для хранения моей структуры и элементов массива. Использование std :: vector также относится к той же категории. Если вам интересно, почему я не хочу использовать указатель вместо этого,Ответ Р. на другой вопрос дает хороший обзор.

В других местах были подобные вопросы, но ни один из них не дал ответа на этот конкретный вопрос:

Допустимы ли члены гибкого массива в C ++?: Очень похоже, но вопрос в том, допустим ли FAM в C ++ (нет). Я ищу вескую причину, чтобы выбрать один или другой.Соответствующий вариант старого «struct hack»: Предлагает альтернативу, но она не красива и не всегда корректна (что если заполнение добавлено в структуру?). Доступ к элементам позже также не так чист, как при выполненииe.things[42].

Ответы на вопрос(6)

Ваш ответ на вопрос