auto
khấu trừ mọi danh sách bộ khởi tạo kèm theo ngoặc đơn thành std::initializer_list<T>
. (Xem §7.1.6.4.6 bao gồm ví dụ). Thật không may là bạn không thể khởi tạo một mảng hoặc thậm chí std::array
từ một std::initializer_list
khi bạn đã nhận được nó, nhưng bạn có thể sử dụng std::vector
.
#include <vector>
#include <array>
#include <initializer_list>
int main()
{
auto x = {1,2,3};
std::array<int, 3> foo1 = x; // won't work for whatever reason
std::vector<int> foo2 = x; // works as expected
return 0;
}
Tất nhiên điều này đánh bại toàn bộ mục đích của những gì bạn đang cố gắng làm.
Tôi cố gắng viết một công trình xung quanh gọi là make_array
nhưng đã phải nhận ra rằng đây không thể bao giờ làm việc như kích thước của một initializer_list
không phải là một phần của các đối số mẫu của nó và vì vậy bạn chỉ thể hiện hóa một make_array
mẫu cho mỗi T
. Điều này hút.
template<typename T>
auto make_array(const std::initializer_list<T>& x)
-> std::array<T, x.size()> { } // maaah
Vâng, rõ ràng là bạn có thể đi cho variadic-template Hack đề cập ở đây How do I initialize a member array with an initializer_list?
Tại sao tất cả mọi người muốn lợi dụng các tính năng ngôn ngữ mới. –
@Martin: Tôi hoàn toàn không có ý định lạm dụng một ngôn ngữ rất đẹp như C++. Tôi chỉ tò mò về những lý do (kỹ thuật, đạo đức, vv) đằng sau quyết định này. –
@Martin: Bạn phải chạm vào các bề mặt để biết tường ở đâu trước khi bắt đầu chạy một cách mù quáng. – Klaim