Вот чрезвычайно простой код:
template <typename... Args,
typename std::enable_if<std::less<int>()(sizeof...(Args), 3), int>::type* = nullptr>
void test(std::tuple<Args...>)
{
}
int main()
{
test(std::make_tuple(1, 2));
}
Это просто простой шаблон функции с некоторым условием enable_if
. (для дальнейшего SFINAE).
Но не удается скомпилировать в Visual Studio 2019 с настройкой C ++ 17 .
error C2672: 'test': no matching overloaded function found
error C2783: 'void test(std::tuple<_Types...>)': could not deduce template argument for '__formal'
Однако я обнаружил, что хорошо компилируется в GCC и Clang . Почему этот, казалось бы, невинный код терпит неудачу?
Забавно, если я подставлю sizeof...(Args)
на 2
, тогда это вдруг сработает.
Редактировать : Мой оригинальный вопрос не предоставляет тип в enable_if
, но я обнаружил, что void*
не допускается как параметр шаблона нетипичного типа в C ++ 17. Но это не имеет значения. Потому что даже если я перейду на std::enable_if<std::less<int>()(sizeof...(Args), 3), int>
, , он все равно завершится с той же ошибкой.