以下代码与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来防止元组超出范围?
答案 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...);
}