В std::array мы можем просто заявить вот так
std::array<std::array<char,10>, 2> arr_gcc{
"abcdefghi", "abcdefghi"
};
Или даже в clang с -Wall им просто нужно несколько более явное выражение, добавляя еще несколько фигурных скобок подобъекта, подобных этой
std::array<std::array<char,10>, 2> arr_clang_wall_favor{{
{"abcdefghi"}, {"abcdefghi"}
}};
Когда дело доходит до std::vector, одним из способов является явное построение каждого подобъекта, подобного его
// This works in both clang and gcc
std::vector vec{
std::array<char,10>{"abcdefghi"}, std::array<char,10>{"abcdefghi"}
};
Если мы попытаемся сделать в совокупности вот так
std::vector<std::array<char,10> > vec_clang{{
{"abcdefghi"}, {"abcdefghi"}
}};
Он работает только в clang, но это ошибка в gcc, поскольку
<source>: In function 'int main()':
<source>:21:6: error: no matching function for call to 'std::vector<std::array<char, 10>, std::allocator<std::array<char, 10> > >::vector(<brace-enclosed initializer list>)'
}};
^
In file included from /opt/compiler-explorer/gcc-7.3.0/include/c++/7.3.0/vector:64:0,
from <source>:2:
/opt/compiler-explorer/gcc-7.3.0/include/c++/7.3.0/bits/stl_vector.h:411:2: note: candidate: template<class _InputIterator, class> std::vector<_Tp, _Alloc>::vector(_InputIterator, _InputIterator, const allocator_type&)
vector(_InputIterator __first, _InputIterator __last,
^~~~~~
/opt/compiler-explorer/gcc-7.3.0/include/c++/7.3.0/bits/stl_vector.h:411:2: note: template argument deduction/substitution failed:
<source>:21:6: note: candidate expects 3 arguments, 1 provided
}};
^
Есть ли общие различия в инициализации между std::vector и std::array? Если да, то почему?
По стандарту, должен ли gcc компилировать этот агрегат, как clang?
«Инициализация списка», если вы никогда о нем не слышали ...
@NickyC Должен ли я изменить вопрос для инициализации списка?
Трудно сказать. Точно сказать не могу.
Явная передача того, что вы утверждаете, что вектор содержит, то есть char[10], похоже, работает нормально везде: ideone.com/BzjZr6
@KillzoneKid Кажется, у нас действительно так много правил инициализации!
Для вашего последнего примера наиболее разумным способом является использование двух слоев скобок, в то время как три слоя также допустимы (GCC отклоняет как двухслойную версию, так и трехслойную версию). Это ошибка GCC, возможно, связанная с Вот этот.





std::vectorне является агрегатом .... так что ...