类数据成员指针的非类型模板参数包无法使用 gcc 编译

Non-type template parameter pack for class data member pointer can't compile with gcc

本文关键字:包无法 参数 编译 gcc 指针 数据成员 类型      更新时间:2023-10-16

我尝试用 c++17 编写代码auto类数据成员指针的非类型模板参数包,但以下代码 clang 将编译而 gcc 不会,你可以看到 godbolt 的错误消息,有人可以告诉我我应该相信哪一个,因为我无法弄清楚为什么 gcc 拒绝这个。

谢谢你的帮助。

template <
typename B,
template <auto B::*...> typename Wrapper, 
auto B::*... Args
>
void f(Wrapper<Args...>) {}
template <auto... Args> struct Wrapper {};
struct A { int i; float f; };
// gcc error: unable to deduce 'auto B::*' from '&A::i'
f(Wrapper<&A::i, &A::f>{});

我知道如果将<auto B::*...>更改为<auto...>则两者都可以编译,但我想知道为什么gcc 无法推断出正确的类型,因为以下非自动模板参数得到相同的情况:gcc 无法编译,而 clang 可以:

template <
typename B,
typename... MT,
template <MT B::*...> class Wrapper, 
MT B::*... Args
>
void f(Wrapper<Args...>) {}

尝试使用

template <
template <auto ...> typename Wrapper, 
auto ... Args
>
void f(Wrapper<Args...>) {}

autoB::*的替代方法;所以你应该使用autoB::*,而不是两者兼而有之。