Ответ 1
В настоящее время нет способа сделать это, не сворачивая свой собственный make_array
, есть предложение для этого N3824: make_array, которое имеет следующую область:
LWG 851, предназначенный для обеспечения синтаксиса замены
array<T, N> a = { E1, E2, ... };
поэтому следующее
auto a = make_array(42u, 3.14);
хорошо сформирован (с добавлением дополнительных static_casts внутри), потому что
array<double, 2> = { 42u, 3.14 };
хорошо сформирован.
В этом документе предлагается создать набор интерфейсов создания std:: array которые являются всеобъемлющими как с точки зрения кортежей, так и с массивами точка зрения, поэтому сужение просто естественно запрещено. Подробнее управляемые этим направлением в проектных решениях.
Он также включает примерную реализацию, которая довольно длинна, поэтому копирование здесь нецелесообразно, но у Konrad Rudolph есть упрощенная версия здесь, что соответствует приведенной выше реализации выборки:
template <typename... T>
constexpr auto make_array(T&&... values) ->
std::array<
typename std::decay<
typename std::common_type<T...>::type>::type,
sizeof...(T)> {
return std::array<
typename std::decay<
typename std::common_type<T...>::type>::type,
sizeof...(T)>{std::forward<T>(values)...};
}