Ошибка компилятора с выражением сгиба в enable_if_t - PullRequest
1 голос
/ 10 июля 2019

У меня есть следующий код, где я использую выражение сгиба, чтобы оценить, все ли параметры пакета могут быть преобразованы в первый аргумент функции.По какой-то причине он не компилируется в msvc, когда я делаю то, что кажется очень тривиальным изменением:

#include <type_traits>

#define TRY 1

#if TRY == 1

template<typename B, typename... Args,
std::enable_if_t<((std::is_convertible_v<Args&, B&> && ...)), bool> = true>
void fn(B b, Args...args) {}

#else

template<typename B, typename... Args,
typename = std::enable_if_t<(std::is_convertible_v<Args&, B&> && ...)>>
void fn(B b, Args...args) {}

#endif

int main()
{
    fn(5, 4, 2);
    return 0;
}

Измените TRY на 0, чтобы его компилировать, демонстрация в: https://godbolt.org/z/EGvQ-N

Есть ли важное различие между двумя вариантами, которые мне не хватает, или это ошибка компилятора?

1 Ответ

2 голосов
/ 11 июля 2019

С риском быть немного не по теме, я не уверен, что выражение сгиба - лучший вариант здесь.Я рекомендую вам использовать вариант std::conjunction, который поддерживает MSVS:

- std::enable_if_t<((std::is_convertible_v<Args&, B&> && ...)), bool> = true>
+ std::enable_if_t<std::conjunction_v<std::is_convertible<Args&, B&>...>, bool> = true>

Правда, это более многословно, но, возможно, более понятно.Я обращаюсь к @NathanOliver, чтобы отследить потенциальную ошибку MSVS, как первоначально просили.

(Я бы поставил это как комментарий, но думал, что блок кода был более понятным.)

...