Учитывая класс Foo
, который имеет некоторый конструктор по умолчанию, инициализирующий значение:
class Foo {
private:
uint32_t x;
public:
constexpr Foo()
: x { 3 }
{}
// ... and some other constructors
};
Мне нужно выделить массив этих Foo
. Я не хочу, чтобы конструкторы элементов массива по умолчанию запускались, потому что позже я все равно буду явно инициализировать каждый элемент. Что-то вроде этого:
Foo foos[20000];
for (int i = 0; i < 20000; ++i) {
foos[i] = init(i);
}
Есть ли способ получить такой неинициализированный массив Foo
, учитывая, что нам не разрешено изменять конструктор по умолчанию Foo
на неинициализирующий?
Кстати, именно так вы бы создали неинициализированный массив в D:
Foo[20000] foos = void;
...и вот то же самое в Rust:
let mut foos: [Foo; 20000] = unsafe { std::mem::uninitialized() };
char
не имеет строгих проблем с псевдонимами. Однако может потребоваться размещениеnew
. - person zch   schedule 12.03.2015char
может использоваться для псевдонима других типов, но другой тип не может использоваться для псевдонимаchar
- person M.M   schedule 12.03.2015vector::reserve
). - person M.M   schedule 12.03.2015new
имеет дело с этим. Тогда ваша программа вообще не будет пытаться получить доступ к сохраненному значению объекта через glvalue до тех пор, пока объект соответствующего типа не будет создан с помощьюnew
. Это в основном то, что сделало бы любое использованиеstd::aligned_storage
. - person zch   schedule 12.03.2015Foo
мог бы иметь, например, следующий неинициализирующий конструктор не по умолчанию:Foo(Uninitialized) {}
и было бы вспомогательное перечисление для вызова этого:enum Uninitialized { uninit };
. Я не понимаю, как такое ослабление инкапсуляции поможет решить мою проблему. - person kmky   schedule 12.03.2015char*
s наarr
и черезFoo*
, напримерfoos
- если только этот последний используется для инициализации/доступа/изменения памяти, есть ли все еще потенциальная проблема? я бы не рискнул.... - person Tony Delroy   schedule 12.03.2015std::array
не имеет конструкторов. - person kmky   schedule 12.03.2015Foo foos[20000] = { uninit, uninit, uninit, uninit,
etc. - либо копирование-вставка, либо использование другой программы для генерации исходного кода для вас. Другим вариантом было бы получить отFoo
и предоставить конструктор по умолчанию, который делает то, что вы хотите; а затем получите свой массив производного класса (который при необходимости может сократиться доFoo
). - person M.M   schedule 12.03.2015