Hãy nói rằng tôi có một loại mà không phải là di chuyển cũng không copyable:Làm thế nào để khởi tạo một chuỗi các đối tượng không thể di chuyển, không thể sao chép?
struct foo
{
explicit foo(size_t){}
~foo(){}
foo(foo const &) = delete;
foo(foo &&) = delete;
foo& operator=(foo const &) = delete;
foo& operator=(foo &) = delete;
};
Bây giờ đưa ra một số được biết đến tại thời gian biên dịch (gọi nó là N), có cách nào mà tôi có thể tạo ra một "chuỗi" các trên stack với mỗi một khởi tạo với số 0 đến N-1? Tôi sẽ hài lòng với một mảng kiểu C foo[N]
, một std::array< foo, N >
hoặc thậm chí là std::tuple
của một số loại.
Những gì tôi đang cố gắng để tránh được viết ra:
foo f0(0), f1(1), ... fNminus1(N-1);
khi nó cảm thấy như thế này là một cái gì đó trình biên dịch sẽ có thể làm cho tôi. Điều tốt nhất tôi có thể nghĩ ra là sử dụng boost::optional
.
Nhưng dựa trên logic thời gian chạy mặc dù tất cả thông tin bắt buộc có sẵn tại thời gian biên dịch. Ngoài ra, tôi còn lại với một cái gì đó hoạt động giống như một mảng con trỏ.
Tôi sợ tôi phải bỏ phiếu này xuống. Vấn đề ở đây là nếu 'construct' ném một ngoại lệ, bạn sẽ gọi hàm hủy của đối tượng chưa bao giờ được xây dựng. –
@DavidStone Có vấn đề này. Các nhà xây dựng không nên ném. Tôi đã thêm một 'static_assert'. Trong câu trả lời từ Benjamin Lindley, khi constructor thất bại, không có destructor nào được gọi. – R1tschY
Đã thay đổi thành upvote –