使用“if constexpr”防止元组超出范围

时间:2017-12-15 18:42:51

标签: c++ visual-c++ c++17

以下代码与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&lt; 18446744073709551613,std :: tuple&lt;&gt;&gt;)。

是否可以使用constexpr来防止元组超出范围?

1 个答案:

答案 0 :(得分:6)

这是一个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...);
}