Предотвращение выхода кортежа за пределы с помощью if constexpr

Следующий код отлично компилируется с GCC и Clang, но перестал работать в последнем обновлении Visual Studio (/ std: c ++ latest):

#include <tuple>

template<int pos, typename... T>
void check_tuple(T... types) {
    if constexpr (pos <= -1) {
        // nothing
    } else {
        using Type = typename std::tuple_element<pos, std::tuple<T...>>::type;
    }
}

int main() {
    check_tuple<0>(1.0, 1.0);
    check_tuple<-1>(1.0, 1.0);
}

В последней версии Visual Studio (/ std: c ++ latest) компиляция завершается ошибкой, когда индекс кортежа выходит за границы (std :: tuple_element ‹18446744073709551613, std :: tuple‹ >>).

Можно ли предотвратить выход кортежа за пределы с помощью constexpr, подобного этому?


person Petter    schedule 15.12.2017    source источник


Ответы (1)


Это ошибка VS (сообщите в Microsoft). Код должен работать как есть.


А пока вы можете прибегнуть к тому, как мы раньше решали эту проблему: отключению тегов.

template<int pos, typename... T>
void check_tuple_impl(std::true_type, T... types) {
    // nothing
}

template<int pos, typename... T>
void check_tuple_impl(std::false_type, T... types) {
    using Type = typename std::tuple_element<pos, std::tuple<T...>>::type;
}

template<int pos, typename... T>
void check_tuple(T... types) {
    check_tuple_impl<pos>(std::integral_constant<bool, (pos <= -1)>{}, types...);
}
person Barry    schedule 15.12.2017