Это не такая большая проблема с std::map::try_emplace
, как с std::pair
.Поскольку это простое объявление будет воспроизводить ошибку, коренящуюся в той же самой проблеме:
std::pair<const int, Foo> p(
std::piecewise_construct,
std::forward_as_tuple(0),
std::forward_as_tuple(i)
);
И на самом деле это не проблема только с std::pair
.Как реферат n4462 деталей, он довольно распространен.Проще говоря, эта пара c'or (как и многие библиотечные функции) выполняет пересылку следующим образом:
second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
Таким образом, нет фигурных скобок и, следовательно, нет агрегированной инициализации, только инициализация значения.Ваши единственные варианты сегодня - определить фактический c'tor или использовать что-то вроде Passer By ' умное решение .
Существуетстатья в полете ( p0960 ), предназначенная для решения этой проблемы в будущих редакциях стандартов, но только время покажет, как это будет развиваться.