Пример кода:
#include <unordered_map>
int main() {
std::unordered_map<int, std::pair<int, int>> map;
map.emplace(1, {1, 1});
return 0;
}
Где emplace()
имеет подпись, как:
template <class... _Args>
pair<iterator, bool> emplace(_Args&&... __args);
gcc
говорит, что функция ожидает 0 аргументов — 2 предоставлено. clang
говорит, что функция ожидает 1 аргумент — 2 предоставляется.
Я даже не понимаю — в чем проблема с этим кодом?
Проблема в том, что {1, 1}
не является выражением и не имеет типа. Поскольку он не имеет типа, он не может быть выведен в список аргументов шаблона. Ни один из них не является правильным, потому что проблема не имеет никакого отношения к количеству предоставленных аргументов.
Я даже не понимаю — в чем проблема с этим кодом?
По какой-то непонятной причине аргумент-список-инициализатор — это не выводимый контекст, см. initializer_list и вычет типа шаблона. Это потому, что так говорится в § 14.8.2.5/5 стандарта C ++ 11. Я не знаю причины такого, казалось бы, противоречивого и нелогичного поведения, но мы не одиноки:
Вывод типа C ++ и почему вы заботитесь Скотт Мейерс, начиная с 37:00
Если инициализированные скобки не имеют типа, почему комитет так настаивает на выводе их для них?
Что касается вашей ситуации, возможно, самое простое решение:
map.emplace(1, std::make_pair(1, 1));