emplace_back
przesyła wszystkie argumenty do zgodnego konstruktora typu elementu. Teraz, std::map
ma konstruktor listy inicjalizacyjnej, ale oczekuje listy std::pair<const Key, Value>
, tj. std::pair<const int, int>
. push_back
nie jest szablonem, więc oczekuje tylko jednego typu, a zatem wykonuje konwersję w miejscu. Oznacza to, że nie występuje tu odliczanie typu.
Musisz wyraźnie określić, że chcesz mieć std::pair
; dodaje powinno działać:
#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;
}
Z tego samego powodu, to nie kompiluje:
v.emplace_back({std::pair<const int,int>(1,2),
std::pair<const int,int>(3,4)});
To dlatego, że choć lista zamkniętych klamra może przynieść inicjator-list, to nie robi musieć. Może to być również wywołanie konstruktora lub coś podobnego. Tak, pisanie
auto l = {std::pair<const int,int>(1,2),
std::pair<const int,int>(3,4)};
daje fragment lista initializer dla l
, ale sam wyraz może być wykorzystane w inny sposób:
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)}
Cały ten materiał staje się trochę niechlujny.
Zasadniczo, jeśli masz listę zamkniętą, może ona przynieść listę inicjalizacyjną lub wywołać odpowiedni konstruktor. Istnieją przypadki, w których kompilator nie jest w stanie określić, które typy są potrzebne; emplace_back
jest jednym z nich (ze względu na przekazywanie). W innych przypadkach działa, ponieważ wszystkie typy są zdefiniowane w wyrażeniu. Np .:
#include <vector>
#include <utility>
int main()
{
std::vector<std::pair<const int, int>> v =
{{1,2},{3,4},{5,6}};
return 0;
}
Powodem, dla którego to nie działa, jest to, że nie można wywnioskować żadnego typu. To znaczy. emplace_back
próbuje wyprowadzić nazwę typów wejściowych, ale nie jest to możliwe, ponieważ lista zamknięta zawiera kilka typów, które może opisać. Dlatego nie ma pasującego wywołania funkcji.
Brak. używając tylko nawiasów klamrowych i nawiasów – gjha
Wierzę, że nie przekazujemy skonstruowanych obiektów do emplace_back. – gjha
Istnieje 'v.emplace_back (std :: map {{1,2}}); .. .. nie idealny oczywiście –