Как передать список инициализации в скобках конструктору `std::array`?

Можно ли передать точный список инициализации в скобках конструктору std::array? Это может быть необходимо, поскольку std::array не поддерживает назначение списка инициализаторов.

Попытка адаптировать принятый ответ на этот вопрос: Как построить std:: объект массива со списком инициализаторов? (сокращенная ссылка ответа: https://stackoverflow.com/a/6894191/4385532 ) к моей проблеме, я придумал следующее «решение» проблемы передачи скобочного списка инициализации конструктору std::array:

template<class T, std::size_t N> struct ArrayWrapper
{
    std::array<T,N> arr;
    ArrayWrapper(T &&... init) : arr{{std::forward<T>(init)...}} {}
}

Я надеялся, что это позволит использовать следующий синтаксис:

int main()
{
  ArrayWrapper<int, 4> aw{{1,2,3,4}};
  std::cout << aw.arr[2] << '\n';
}

Однако я потерпел неудачу. Это не скомпилируется: http://ideone.com/VJVU1X

Я не уверен, в чем моя ошибка. Я надеялся, что эта строка

ArrayWrapper(T &&... init) : arr{{std::forward<T>(init)...}} {}

будет захватывать точные элементы списка init-list, переданного в конструктор ArrayWrapper, и перенаправлять их в конструктор std::array.

Что я не понимаю?


person Community    schedule 14.11.2016    source источник
comment
T &&... init — это расширение пакета, которое не содержит пакета, поэтому оно не будет работать.   -  person cpplearner    schedule 15.11.2016
comment
std::array является агрегатом — у него нет имеет конструктора, и я не уверен, какая документация заставила вас поверить, что он будет. Это может быть необходимо, поскольку std::array не поддерживает назначение списка инициализаторов. Итак? То есть, почему вы считаете это проблемой?   -  person ildjarn    schedule 15.11.2016
comment
Является ли конечной целью поддержка именно этого синтаксиса: ArrayWrapper<int, 4> aw({1,2,3,4});? ArrayWrapper<int, 4> aw(1,2,3,4); приемлемо? Как насчет ArrayWrapper<int, 4> aw({{1,2,3,4}});? Это сильно пахнет проблемой XY...   -  person ildjarn    schedule 15.11.2016
comment
@ildjarn Я пытаюсь написать оболочку, которая будет поддерживать каждый поддерживаемый std::array синтаксис. Согласно en.cppreference.com/w/cpp/concept/SequenceContainer# cite_note-1 std::array должен поддерживать назначение init-list в фигурных скобках, то есть такой синтаксис: std::array<int, 4> arr({1,2,3,4});. Поскольку std::array поддерживает этот синтаксис, я хочу, чтобы моя оболочка также поддерживала этот синтаксис.   -  person    schedule 15.11.2016
comment
@ildjarn Хотя, строго говоря, вы правы, этот вопрос касается моей неудачной попытки решить мою проблему, которую я указал в этом вопросе: stackoverflow.com/questions/40599052/   -  person    schedule 15.11.2016
comment
@ildjarn Прости. В этом случае я соответствующим образом отредактировал свой вопрос. Я надеюсь, что синтаксис теперь правильный.   -  person    schedule 15.11.2016
comment
Согласно вашему редактированию, такой конструктор, как ArrayWrapper(T const(&a)[N]) { std::copy(a, a+N, arr.data()); } разрешил бы такой синтаксис, но у меня нет идея, если она действительно имеет семантику, которую вы хотите...   -  person ildjarn    schedule 15.11.2016