Почему вариадная функция не может «съесть»? аргумент инициализации списка в C ++ 11?

Пример кода:

#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 предоставляется.

Я даже не понимаю — в чем проблема с этим кодом?

14

Решение

Проблема в том, что {1, 1} не является выражением и не имеет типа. Поскольку он не имеет типа, он не может быть выведен в список аргументов шаблона. Ни один из них не является правильным, потому что проблема не имеет никакого отношения к количеству предоставленных аргументов.

12

Другие решения

Я даже не понимаю — в чем проблема с этим кодом?

По какой-то непонятной причине аргумент-список-инициализатор — это не выводимый контекст, см. initializer_list и вычет типа шаблона. Это потому, что так говорится в § 14.8.2.5/5 стандарта C ++ 11. Я не знаю причины такого, казалось бы, противоречивого и нелогичного поведения, но мы не одиноки:

Что касается вашей ситуации, возможно, самое простое решение:

map.emplace(1, std::make_pair(1, 1));
7

По вопросам рекламы [email protected]