Это не дает прямого ответа на мой вопрос, но это просто обходной путь (на самом деле это не обходной путь, а гораздо более чистое решение для реального кода по сравнению с MVCE, приведенным выше) с использованием std:: conunction / disjunction, предложенный @Frank в комментарии., в случае, если кто-то еще приземлится здесь по той же причине.
Это работает на VS, как и ожидалось:
#include <iostream>
#include <type_traits>
#include <utility>
template <bool... Bs>
using bool_and =
std::conjunction<std::integral_constant<bool, Bs>...>;
template <bool... Bs>
using bool_or =
std::disjunction<std::integral_constant<bool, Bs>...>;
int main()
{
std::cout << bool_or<true>::value << std::endl;
std::cout << bool_or<true, true>::value << std::endl;
std::cout << bool_or<true, true, true>::value << std::endl;
}
, а также live