"-6ren"> "-Clang 的行为“未定义模板 smthg”是否有(干净的)解决方法? 代码示例: https://godbolt.org/z/GGs7ndKE4 (复制/粘贴见下文) 额外的见解: 这个问题是不是 -6ren">
gpt4 book ai didi

c++ - Clang 错误 "implicit instantiation of undefined template std::tuple_size"

转载 作者:行者123 更新时间:2023-12-04 13:28:08 24 4
gpt4 key购买 nike

Clang 的行为“未定义模板 smthg ”是否有(干净的)解决方法?
代码示例:

  • https://godbolt.org/z/GGs7ndKE4 (复制/粘贴见下文)

  • 额外的见解:
  • 这个问题是不是 可使用 重现海合会也不是 MSVC/CL ,
    因此只影响叮当 clang-cl
  • Clang-cl 添加以下错误信息:
      error : cannot mangle this 'auto' type yet

  • 我期望的是,根据上面提供的示例,分别获得两种具有相同的类型 - 可评估 - std::tuple_size_v :
    class std::tuple<
    struct std::integral_constant<bool,0>,
    struct std::integral_constant<bool,1>,
    struct std::integral_constant<bool,0>
    >
    class std::tuple<bool,bool,bool>
    我错过了一个点吗?
    代码示例:
    #include <tuple>
    #include <array>
    #include <type_traits>

    template <template <typename> class trait, typename... Ts>
    struct trait_result {

    template <template <typename...> class T>
    using as_t = T<typename trait<Ts>::type...>;
    template <template <typename...> class T>
    constexpr static auto as_v = T{trait<Ts>::value...};
    using as_tuple_t = as_t<std::tuple>;
    constexpr static auto as_tuple_v = std::tuple{trait<Ts>::value...};
    };

    namespace test
    {
    template <typename T>
    using is_int = std::is_same<int, T>;
    using results = trait_result<is_int, char, int, bool>;

    using results_as_tuple = results::as_t<std::tuple>; // ok
    using results_as_tuple_value_type = std::decay_t<decltype(results::as_v<std::tuple>)>; // ko

    static_assert(std::tuple_size_v<results_as_tuple> == std::tuple_size_v<results_as_tuple_value_type>);
    }

    最佳答案

    template <template <typename...> class T>
    constexpr static auto as_v = T{trait<Ts>::value...};
    这试图使用 T 的扣除指南生成一个类型。
    如果你写
    auto as_v = results::as_v<std::tuple>;
    编译器崩溃,甚至在您的其余工作之前。
    假设您愿意不使用扣除指南:
    template <template <typename...> class T>
    constexpr static T<decltype(trait<Ts>::value)...> as_v = {trait<Ts>::value...};
    使其余的代码编译。
    现在,
    template <template <typename...> class T>
    constexpr static auto as_v = T<decltype(trait<Ts>::value)...>{trait<Ts>::value...};
    键入时也不会编译
    auto as_v = results::as_v<std::tuple>;
    所以问题可能不是扣除指南,而是 constexpr static auto这里。
    这在课外:
    template<template<class...>class T, template<class>class trait, class...Ts>
    constexpr auto foo = T{trait<Ts>::value...};
    连同这个在类里面:
    template <template <typename...> class T>
    constexpr static decltype(foo<T, trait, Ts...>) as_v = foo<T, trait, Ts...>;
    为您提供推导指南,并且没有内部编译器错误。

    关于c++ - Clang 错误 "implicit instantiation of undefined template std::tuple_size<auto>",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66821952/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com