Я думаю, что предпосылка вашего вопроса неверна.
Это действительно единственно возможная альтернатива, если я хочу использовать make_pair?
Зачем вам использовать std::make_pair
здесь?
auto w = std::make_pair<Widget,Widget>({},{}); // Awkward syntax and move construction
Это действительно неловкий синтаксис.Позвольте мне объяснить, почему я так думаю ...
С cppreference на std::make_pair
(подчеркните мое):
Создает объект std :: pair, вывод целевого типа из типов аргументов .
Единственная цель std::make_pair
- вывести типы его аргументов, как, например, в
std::pair<int,int> x;
x = std::pair<int,int>(3,3); // not nice
x = std::make_pair(3,3); // ok
Когда по умолчанию создается пара и вы знаете ее тип, выникогда не приходилось повторять параметры шаблона
std::pair<int,int> a = std::pair<int,int>(); // awkward
Ни когда вы не хотите использовать конструкцию не по умолчанию (просто не используйте auto
, когда его единственным эффектом является то, что вы должны произносить тип в другом месте в той же строке кода)
std::pair<int,int> a{5,4}; // no move/copy
Итог:
Альтернативой является просто не использовать std::make_pair
, когда вам это не нужно.