Powiedzmy mam typ, który nie jest ani przemieszczać ani copyable:Jak zainicjować ciąg nieruchomych, niekopiowalnych obiektów?
struct foo
{
explicit foo(size_t){}
~foo(){}
foo(foo const &) = delete;
foo(foo &&) = delete;
foo& operator=(foo const &) = delete;
foo& operator=(foo &) = delete;
};
Teraz podany numer znany w czasie kompilacji (nazywają to N), czy jest jakiś sposób, że mogę stworzyć „sekwencji” tych na stosie, z każdym zainicjowanym numerami od 0 do N-1? Byłbym zadowolony z tablicy w stylu C: foo[N]
, std::array< foo, N >
lub nawet std::tuple
.
Co staram się unikać pisze się:
foo f0(0), f1(1), ... fNminus1(N-1);
kiedy wydaje się, jakby to coś kompilator powinien być w stanie zrobić dla mnie. Najlepsze, co udało mi się wymyślić, to: boost::optional
.
Ale to opiera się na logice środowiska wykonawczego, mimo że wszystkie wymagane informacje są dostępne podczas kompilacji. Poza tym pozostaje mi coś, co zachowuje się jak tablica wskaźników.
Obawiam się, że muszę to głosować. Problem polega na tym, że jeśli "konstrukt" zgłasza wyjątek, wywołasz destruktor obiektu, który nigdy nie został skonstruowany. –
@DavidStone Tak, to jest problem. Konstruktor nie powinien rzucać. Dodałem 'static_assert'. W odpowiedzi od Benjamina Lindleya, gdy konstruktor zawiedzie, nie jest wywoływany destruktor. – R1tschY
Zmieniono na lotto –