Существуют ли различия в агрегированной инициализации между std :: vector и std :: array?

В 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?

godbolt.org/g/TRZHnu

std::vector не является агрегатом .... так что ...
StoryTeller - Unslander Monica 18.03.2018 09:20

«Инициализация списка», если вы никогда о нем не слышали ...

user2486888 18.03.2018 09:22

@NickyC Должен ли я изменить вопрос для инициализации списка?

sandthorn 18.03.2018 09:26

Трудно сказать. Точно сказать не могу.

user2486888 18.03.2018 09:28

Явная передача того, что вы утверждаете, что вектор содержит, то есть char[10], похоже, работает нормально везде: ideone.com/BzjZr6

Killzone Kid 18.03.2018 10:24

@KillzoneKid Кажется, у нас действительно так много правил инициализации!

sandthorn 18.03.2018 10:55

Для вашего последнего примера наиболее разумным способом является использование двух слоев скобок, в то время как три слоя также допустимы (GCC отклоняет как двухслойную версию, так и трехслойную версию). Это ошибка GCC, возможно, связанная с Вот этот.

xskxzr 18.03.2018 11:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
85
0

Другие вопросы по теме