Эквивалентность двух форм списков инициализаторов в std ::vector и других

#c

#c

Вопрос:

У меня очень простой вопрос:

являются (1-м):

 std::vector<int> foo{1,2,3};
  

и (2-й):

 std::vector<int> foo({1,2,3});
  

Строго то же самое? Как и в, имеют ли они точно такую же функциональность и вызывают ли точно такие же функции внутри std::vector?

Есть ли какой-либо случай, когда эти два отличаются в любом другом аналогичном классе контейнера или варианте использования?

Как std::vector различает списки инициализаторов и вызовы конструктора в первом фрагменте кода? Разве фигурные скобки не используются для обоих?

Комментарии:

1. Вы можете найти всю необходимую информацию здесь . Даже если это изложено не самым легко усваиваемым способом.

Ответ №1:

они разные

{} добавляет значения в вектор

() вызывает конструктор все типы конструкторов приведены по ссылке, приведенной ниже

перенаправлено на cplusplus

Есть ли какой-либо случай, когда эти два отличаются в любом другом аналогичном классе контейнера или варианте использования?

Когда вы добавляете элемент в вектор, используя такие функции, как push_back() и т. Д. мы используем vec_name.push_back(элемент); // обычный парантез, а не фигурные скобки

когда вы создаете многомерный массив или вектор и инициализируете элементы из его объявления, например, для 2D-массива, это выглядит следующим образом int x[3][4] = {{0,1,2,3}, {4,5,6,7}, {8,9,10,11}};

Два основных варианта использования фигурных круглых скобок в cpp :

  1. при объявлении сегмента кода, например, для (параметров) { } , main(параметров) {} , function(параметров) и т. Д.
  2. для инициализации значений в начале

Обычный парантезис используется для передачи параметров или аргументов функции