Даден е клас 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, което да го извика: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,
и т.н. - или копиране-поставяне, или използване на друга програма за генериране на източника вместо вас. Друг вариант би бил да извлечете отFoo
и да предоставите конструктор по подразбиране, който прави това, което искате; и след това имате вашия масив от производния клас (който може да бъде нарязан доFoo
, ако е необходимо). - person M.M   schedule 12.03.2015