我在GCC 10中搞乱了c ++ 20 consteval并编写了这段代码
#include <optional>
#include <tuple>
#include <iostream>
template <std::size_t N, typename Predicate, typename Tuple>
consteval std::optional<std::size_t> find_if_impl(Predicate&& pred,
                                                  Tuple&& t) noexcept {
  constexpr std::size_t I = std::tuple_size_v<std::decay_t<decltype(t)>> - N;
  if constexpr (N == 0u) {
    return std::nullopt;
  } else {
    return pred(std::get<I>(t))
               ? std::make_optional(I)
               : find_if_impl<N - 1u>(std::forward<decltype(pred)>(pred),
                                      std::forward<decltype(t)>(t));
  }
}
template <typename Predicate, typename Tuple>
consteval std::optional<std::size_t> find_if(Predicate&& pred,
                                             Tuple&& t) noexcept {
  return find_if_impl<std::tuple_size_v<std::decay_t<decltype(t)>>>(
      std::forward<decltype(pred)>(pred), std::forward<decltype(t)>(t));
}
constexpr auto is_integral = [](auto&& x) noexcept {
    return std::is_integral_v<std::decay_t<decltype(x)>>;
};
int main() {
    auto t0 = std::make_tuple(9, 1.f, 2.f);
    constexpr auto i = find_if(is_integral, t0);
    if constexpr(i.has_value()) {
        std::cout << std::get<i.value()>(t0) << std::endl;
    }
}它应该像STL查找算法一样工作,但要在元组上工作,而不是返回迭代器,而是根据编译时谓词返回可选索引。现在,此代码可以正常编译并打印出来
9
但是,如果元组不包含整数类型的元素,则该程序不会编译,因为i.value()仍在空的可选字段上调用。现在为什么呢?
                
                1
              
                  较小的示例
                
                
                  
                    —
                     Artyer 
                    
                  
                
              
                  @AndyG不能解决问题,对吗?x)
                
                
                  
                    —
                    Yamahari