Скажем, у меня есть тип, который не является ни движимое, ни копируемыми:Как инициализировать последовательность недвигаемых, не скопируемых объектов?
struct foo
{
explicit foo(size_t){}
~foo(){}
foo(foo const &) = delete;
foo(foo &&) = delete;
foo& operator=(foo const &) = delete;
foo& operator=(foo &) = delete;
};
Теперь данное число, известное во время компиляции (назовем его N), есть ли способ, что я могу создать «последовательность» из них в стеке, каждый из которых инициализируется цифрами от 0 до N-1? Я был бы доволен C-образным массивом foo[N]
, std::array< foo, N >
или, возможно, даже std::tuple
.
То, что я пытаюсь избежать в выписывая:
foo f0(0), f1(1), ... fNminus1(N-1);
, когда он чувствует, что это то, что компилятор должен быть в состоянии сделать для меня. Лучшее, что я смог придумать, это использовать boost::optional
.
Но это зависит от логики выполнения, хотя вся необходимая информация доступна во время компиляции. Кроме того, у меня осталось что-то, что ведет себя как массив указателей.
Я боюсь, что я должен проголосовать за это. Проблема здесь в том, что если 'construct' генерирует исключение, вы вызовете деструктор объекта, который никогда не был создан. –
@DavidStone Да, это проблема. Конструктор не должен бросать. Я добавил 'static_assert'. В ответе Бенджамина Линдли, когда конструктор терпит неудачу, деструктор не вызван. – R1tschY
Изменено на верхний уровень –