Может быть, так?
#include <vector>
#include <array>
#include <iostream>
int main()
{
std::vector< std::array<int, 2> > v(3, {1,1});
for(auto const& e0 : v)
{
for(auto const& e1 : e0)
std::cout << e1 << ", ";
std::cout << "\n";
}
}
Выход: "Почему мы должны использовать две скобки"
1, 1,
1, 1,
1, 1,
Исходный код на мой вопрос был
std::vector< std::array<int, 2> > v(3, {{1,1}});
, но я решил удалить, что вторая пара скобок. Они были там, чтобы подавить предупреждение clang ++. Обычно std::array
содержит (необработанный) массив. Одной пары брекетов достаточно для инициализации этого внутреннего массива, но clang ++ выдает предупреждение, потому что элементы {1,1}
(одна пара фигурных скобок) используются для инициализации элементов этого внутреннего массива, а не для совокупности (внешний std::array
). Quoth лязг ++:
предупреждение: предложить распорки вокруг инициализации подобъекте
Я смотрел это в стандарте, и это требует в [array.overview]/2
Массив представляет собой совокупность (8.5.1), который может быть инициализирован с помощью синтаксиса
инициализатор-лист};
где инициализатор-лист является разделенный запятыми список до N
элементов, чьи типы могут быть конвертированы в T
.
передачи аргументов использует ту же спецификацию, как эта форму инициализации (называемой копирование инициализации, [dcl.init]/15), поэтому, используя одну пару фигурных скобок гарантируется на работу.
OTOH, нет требования, чтобы std::array
содержит (необработанный) массив.
Ваш код работает великолепно, но теперь у меня есть несколько вопросов: – Pippo
Зачем нам использовать две скобки? – Pippo
Почему этот метод не работает, если я инициализирую v как глобальную переменную (вне основной)? – Pippo