emplace_back
передает все аргументы в соответствующий конструктор типа элемента. Теперь std::map
имеет конструктор списка инициализаторов, но он ожидает список std::pair<const Key, Value>
, то есть std::pair<const int, int>
. push_back
не является шаблоном, поэтому он просто ожидает один тип и, таким образом, выполняет преобразование на месте. То есть здесь не происходит никакого вывода.
Вам нужно будет явно указать, что вы хотите иметь std::pair
; следующий должен работать:
#include<map>
#include<vector>
int main()
{
std::vector<std::map<int, int>> v;
v.emplace_back(std::initializer_list<std::pair<const int, int>>{
{1,2},{3,4},{5,6}});
return 0;
}
По той же причине, это не компилируется:
v.emplace_back({std::pair<const int,int>(1,2),
std::pair<const int,int>(3,4)});
Это происходит потому, что, хотя скобку огороженного список может привести к инициализатору-лист, он не должен. Это может быть вызов конструктора или что-то в этом роде. Таким образом, написание
auto l = {std::pair<const int,int>(1,2),
std::pair<const int,int>(3,4)};
дает список инициализатора l
, но само выражение может быть использован по-другому:
std::pair<std::pair<const int, int>, std::pair<const int, int>> p =
{std::pair<const int,int>(1,2),
std::pair<const int,int>(3,4)}
Всего этот материал становится немного грязным.
В принципе, если у вас есть список, заключенный в фигурные скобки, он может выдавать список инициализаторов или вызывать соответствующий конструктор. Бывают случаи, когда компилятор не может определить, какие типы необходимы; emplace_back
является одним из них (из-за пересылки). В других случаях это работает, потому что все типы определены в выражении. Например:
#include <vector>
#include <utility>
int main()
{
std::vector<std::pair<const int, int>> v =
{{1,2},{3,4},{5,6}};
return 0;
}
Теперь причина, по которой он не работает, заключается в том, что тип не может быть выведен. То есть emplace_back
пытается вывести имя входных типов, но это невозможно, поскольку список, заключенный в фигурные скобки, имеет несколько типов, которые он может описать. Следовательно, не существует соответствующего вызова функции.
Их нет. используя только скобки и скобки – gjha
Я считаю, что мы не передаем построенные объекты emplace_back. – gjha
Существует 'v.emplace_back (std :: map {{1,2}});' .. не идеальный конечно –