template <typename = std::enable_if_t<(sizeof...(Args) > 0)>>
Inner(const Outer* out)
Когда Args
пусто, это
template <typename = std::enable_if_t<false>>
Inner(const Outer* out)
SFINAE применяется только к функциям, когда SFINAE зависит от параметров шаблона функции. Здесь это не так. Итак, серьезная ошибка правильна.
Это может быть случай, когда диагностика не требуется, и ваша программа по-прежнему плохо сформирована (поэтому компилятор может делать все что угодно). Дразнить это сложно, и, поскольку есть простой обходной путь, вы можете сделать это.
template <std::size_t N = sizeof...(Args), typename = std::enable_if_t<(N > 0)>>
или мой любимый
template <std::size_t N = sizeof...(Args), std::enable_if_t<(N > 0), bool> = true>
, который лучше работает при перегрузках.
Однако в вашем конкретном случае первый ctor становится вторым:
Inner(const Outer* out, Args... vals)
: outer(out)
, values(vals...)
{}
когда Args...
пусто, поэтому я не вижу здесь смысла.