Это ваша ошибка, а не MSVC.
Foo
Конструктор копирования не noexcept
и не имеет конструктора перемещения. Bar
неявно объявленный конструктор перемещения также не является noexcept
, потому что ему нужно вызвать вышеупомянутый конструктор копирования для Foo
члена данных. emplace_back
может перераспределить, и, поскольку Bar
выглядит копируемым, это перераспределениескопирует существующие элементы, чтобы сохранить строгую гарантию безопасности исключений. - Это копирование может быть выполнено, в зависимости от реализации, из
const
или не const
Bar
lvalue. - Ваш шаблон конструктора без ограничений копирует из неконстантного
Bar
lvalue. - Далее следуют взрывы и фейерверки.
Исправление состоит в том, чтобы ограничить шаблон конструктора так, чтобы он нене угоняйНапример:
template <class... Args,
class = std::enable_if_t<std::is_constructible_v<Foo, Args...>>>
Bar(Args&&... args)
: foo(std::forward<Args>(args)...) {}