【发布时间】:2021-08-10 12:29:34
【问题描述】:
我正在研究一种使用多重继承而不是经典递归定义的元组类型。 这样做时,我在扩展多个根据clang具有不同长度的参数包时遇到了一个奇怪的问题,而gcc编译代码没有问题。
可以在此处找到一个演示问题的小示例: https://godbolt.org/z/oKbYKd9je
使用 clang 12.0.1 编译时出现错误:
包扩展包含具有不同的参数包“Ts” 来自外部参数包的长度(3 vs. 1)
当切换到 gcc 11 时,代码编译没有问题。 我想知道哪个编译器是正确的?对我来说,这似乎应该可以正常工作,并且该错误已存在。
此处也包含代码,以防外部链接过期:
#include <type_traits>
#include <utility>
template <size_t index, typename T>
struct element_holder {
T value;
};
template <typename... Ts>
struct tuple : public Ts... {};
namespace detail{
template<typename T>
struct make_tuple_impl2;
template<size_t...Is>
struct make_tuple_impl2<std::index_sequence<Is...>>{
template<typename ...Ts>
using f = tuple<element_holder<Is, Ts>...>; //<-- error occurs here
};
template<size_t n>
struct make_tuple_impl{
template<typename... Ts>
using f=typename make_tuple_impl2<std::make_index_sequence<n>>::template f<Ts...>;
};
}
struct make_tuple{
template<typename ...Ts>
// This does not work with clang 12.0.1, but does with gcc 11
using f = typename detail::make_tuple_impl<sizeof...(Ts)>::template f<Ts...>;
//This works:
//using f=typename detail::make_tuple_impl2<std::make_index_sequence<sizeof...(Ts)>>::template f<Ts...>;
};
int main() {
using tuple_t = typename make_tuple::template f<int, int, bool>;
}
【问题讨论】:
-
可能相关? Clang fails to expand parameter pack in std::function instantiation 。让我印象深刻 - clang 无法扩展
Ispack。 -
@Gambit1614 听起来可能是相关的,但老实说我不知道。从我得到的错误中,听起来它确实没有扩展 Is,但我不知道它不扩展 Is 的原因是否与另一个问题相同。也许对依赖类型以及编译器处理它们的方式有更多了解的人可以在这里提供更多见解。
标签: c++ gcc clang variadic-templates