gpt4 book ai didi

c++ - 在clang中对不同长度的包进行包扩展,在gcc中编译。谁是对的?

转载 作者:行者123 更新时间:2023-12-04 11:56:32 25 4
gpt4 key购买 nike

我正在研究一种使用多重继承而不是经典递归定义的元组类型。
这样做时,我在扩展多个参数包时遇到了一个奇怪的问题,这些参数包根据 clang 具有不同的长度,而 gcc 编译代码没有问题。
可以在此处找到一个演示该问题的小示例:
https://godbolt.org/z/oKbYKd9je
使用 clang 12.0.1 编译时出现错误:

pack expansion contains parameter pack 'Ts' that has a differentlength (3 vs. 1) from outer parameter packs


切换到 gcc 11 时,代码编译没有问题。
我想知道哪个编译器是正确的?对我来说,这似乎应该可以正常工作并且错误在 clang 中。

此处还包含代码,以防外部链接过期:
#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>;
}

最佳答案

不是这个问题的直接答案,但如果有人在这里寻找解决方法,这里有一个替代方案:
只要两个参数包都在同一个模板声明中,它就可以在两个编译器上正常工作。
这是 OP 代码的样子:

namespace detail{

template<typename... T>
struct make_tuple_impl2;

template<size_t...Is, typename... Ts>
struct make_tuple_impl2<std::index_sequence<Is...>, Ts...>{
using type = tuple<element_holder<Is, Ts>...>;
};

template<size_t n>
struct make_tuple_impl{
template<typename... Ts>
using f=typename make_tuple_impl2<std::make_index_sequence<n>, Ts...>::type;
};
}

关于c++ - 在clang中对不同长度的包进行包扩展,在gcc中编译。谁是对的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68726838/

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