Tôi có lớp (bên thứ ba) không thể sao chép được. Tôi muốn khởi tạo một mảng của chúng. Đây là nỗ lực hết sức mình:Khởi tạo mảng C++ 11 với loại không thể sao chép được với hàm tạo rõ ràng
#include <array>
class Thing
{
public:
explicit Thing(int) {}
Thing(const Thing&) = delete;
};
int main()
{
std::array<Thing, 1> things{{{100}}}; // error here
};
GCC 4.7.2 nói:
error: converting to ‘std::array::value_type {aka Thing}’ from initializer list would use explicit constructor ‘Thing::Thing(int)’
OK, nhưng đó chính xác là những gì tôi muốn - sử dụng các nhà xây dựng rõ ràng. Làm thế nào tôi có thể diễn tả điều đó? Nếu tôi thực sự gọi bản thân hàm tạo, thì tôi sẽ gặp lỗi về hàm tạo bản sao đang bị xóa. Và tôi không thể sử dụng std::move()
vì Thing không thể di chuyển được (và tôi không thể sửa đổi nó). Chỉ có duy nhất tôi đã tìm thấy cho đến nay là https://stackoverflow.com/a/15962814/4323 nhưng điều này là không mong muốn bởi vì nó là một bó thêm mã cộng với tôi cần phải đúc "lưu trữ" ở khắp mọi nơi tôi sử dụng nó (hoặc giữ một con trỏ riêng biệt với nó, mà cho biết thêm tôi không muốn).
Tôi muốn một giải pháp mang lại hiệu suất tối đa khi thực sự sử dụng Những thứ không có nhiều bản mẫu xấu xí.
Bạn có thể thêm một hàm tạo rõ ràng có 'initializer_list'? –
Tiêu chuẩn nói rằng đối với 'std :: mảng', 'T' phải là MoveConstructible và MoveAssignable –
Giải pháp trong chuỗi được liên kết không quá đau đớn. Tuy nhiên, bạn phải có một mức độ bất định (tôi không nghĩ rằng việc truy cập 'các thứ [n]' đối với 'std :: array' là khác nhau khi truy cập' các thứ [n] 'trong đó' Mọi thứ '; lưu trữ mà bạn sắp xếp mới) –