类数据成员指针的非类型模板参数包无法使用 gcc 编译
Non-type template parameter pack for class data member pointer can't compile with gcc
我尝试用 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...>) {}
auto
是B::*
的替代方法;所以你应该使用auto
或B::*
,而不是两者兼而有之。
相关文章:
- 如何反转整数参数包
- 如何将enable-if与模板参数和参数包一起使用
- 构造函数在退出函数时无法初始化一个参数
- 模板元编程:如何将参数包组合成新的参数包
- 如何将将参数包作为参数传递给其他模板类的模板类?
- 在 win32 上生成 R 包:无法加载共享对象 (.dll)
- 使用多参数包可变参数模板继承类
- 为什么在函数参数类型中使用模板参数包作为其模板参数列表无法显式指定
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 具有多个包的参数包匹配规则
- 模板参数包无法推断"const&"参数
- 正在拆包方法参数的元组
- 是否可以默认参数包函数参数
- 可变模板包扩展参数id
- 使用空参数包函数参数调用初始值设定项列表中的函数
- Clang 无法使用模板元编程编译参数包扩展
- 为什么 std::bind 不能是参数包的参数?
- 从可变模板类推导类型包,并声明相同类型包的参数
- 模板参数包的参数到 T
- 通过Lambdas解包可变参数