Clang 错误“未定义模板 std::tuple_size<auto> 的隐式实例化”

Gus*_*uss 5 c++ clang++ c++20

对于 Clang 的行为“未定义的模板 smthg<auto>”,是否有一个(干净的)解决方法?

代码示例:

额外的见解:

我期望的是,根据上面提供的示例,分别获得两种具有相同 -可评估- 的类型std::tuple_size_v

  error : cannot mangle this 'auto' type yet
Run Code Online (Sandbox Code Playgroud)

我是否遗漏了一点?

代码示例:

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>
Run Code Online (Sandbox Code Playgroud)

Gus*_*uss 0

感谢@Yakk - Adam Nevraumont,作为结论,这是我修复它的方法:

using as_array_t = std::array<std::tuple_element_t<0, decltype(std::tuple{trait<Ts>::value...})>, sizeof...(Ts)>;
constexpr static inline auto as_array_v = as_array_t{trait<Ts>::value...};
Run Code Online (Sandbox Code Playgroud)

这避免了#if __clang__ /* workaround on clang ICE ... */代码库中的另一个

[编辑]为了完整性目的:

  • 即使上面的代码修复了 Clang 的编译,但它没有修复 Clang-CL 的编译。以下代码仍然无法编译,并显示相同的错误消息。
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>;
using results_as_tuple_value_type = std::decay_t<decltype(results::as_v<std::tuple>)>; // error here
Run Code Online (Sandbox Code Playgroud)