c++ - 类数据成员指针的非类型模板参数包不能用 gcc 编译
问题描述
我尝试用c++17auto
非类型模板参数包为类数据成员指针编写代码,但是下面的代码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...>
then 两者都可以编译,但我想知道为什么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
or B::*
,而不是两者。
推荐阅读
- html - 非视网膜显示器上的 HTML 字体渲染问题
- devtools - 为什么无法保存通过开发人员工具对网站进行的编辑?
- laravel - Laravel 6 - 刀片中的命名路由不允许参数中的特殊字符或大写字母
- string - 用于用户输入的 stol 和 stoi 的 C++ 精度
- c++ - 如果 C++ 使用 cdecl 调用约定,为什么 Godbolt 会显示在 edi 中传递的参数?
- python - 检查输入时出错:预期dense_1_input 的形状为(784,),但得到的数组的形状为(10,)
- python - 如何使用 pandas 导入下三角矩阵?
- r - 如何在 R 中“总结”带有分类变量的列?
- javascript - 转换 BTC 单位并将其反转
- javascript - 导出 unirest req 结束数据时遇到问题