Я испытываю различные способы создания std::vector
на лету и передачи его другой функции:
#include <iostream>
#include <vector>
void print(std::vector<int> a)
{
std::cout << a.size() << '\n';
}
int main()
{
print({1, 2, 3, 4, 5});
print(std::vector<int>{1, 2, 3, 4, 5});
print(std::vector<int>({1, 2, 3, 4, 5}));
}
Это дает желаемый результат:
$ clang++ -std=c++11 foo.cpp && ./a.out
5
5
5
Iхочу знать, в чем различия между этими тремя вызовами:
print({1, 2, 3, 4, 5});
print(std::vector<int>{1, 2, 3, 4, 5});
print(std::vector<int>({1, 2, 3, 4, 5}));
Вот еще один пример:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> a = {1, 2, 3, 4, 5};
// std::cout << (a == {1, 2, 3, 4, 5}) << '\n'; // error
std::cout << (a == std::vector<int>{1, 2, 3, 4, 5}) << '\n';
std::cout << (a == std::vector<int>({1, 2, 3, 4, 5})) << '\n';
}
Вот вывод:
$ clang++ -std=c++11 foo.cpp && ./a.out
1
1
IЯ надеюсь, что ответ на этот вопрос может стать хорошим справочным ответом на эту тему, где в ответе обсуждаются следующие аспекты этих вызовов:
- Три вышеупомянутых и любые другие подобные способы прохождения
std::vector
к другой функции. - Семантические различия между различными методами.
- Различия в производительности (если есть) между различными методами.
- Лучшие практики (если есть), из-за которыходин вызов предпочтительнее другого.
Если вы считаете, что у вопроса есть какие-либо недостатки, пожалуйста, не стесняйтесь редактировать вопрос и улучшать его.