ref合格的成员函数作为模板参数?

av

这在clang 3.3中可以正常编译:

template <typename T>
struct M;

template <typename R, typename C, typename... A>
struct M <R (C::*)(A...)> { };

template <typename R, typename C, typename... A>
struct M <R (C::*)(A...) &> { };

但在gcc 4.8.1中失败:

[...] error: redefinition of ‘struct M <R (C::*)(A ...)>’
 struct M <R (C::*)(A...) &> { };
        ^
[...] error: previous definition of ‘struct M <R (C::*)(A ...)>’
 struct M <R (C::*)(A...)> { };
        ^

在不同的上下文中使用时,这会导致各种意外的编译器行为,例如崩溃或内部编译器错误。

我知道ref限定的成员函数在标准中被称为“ * this的右值引用”(N2439),并且受gcc 4.8.1支持

这里的问题是将它们用作模板参数,其中gcc似乎无法区分ref限定类型和普通成员函数类型。

clang的std库实现似乎检测到此功能是否受支持

__has_feature(cxx_reference_qualified_functions)

那么,这是使用ref限定的函数标准还是语言扩展?

迪特玛·库尔(DietmarKühl)

根据8.3.5 [dcl.fct]第6段(我在引用的文本中添加了一些突出显示的内容):

返回类型,parameter-type-list,ref-qualifier和cv-qualifier-seq(但不是默认参数(8.3.6)或异常规范(15.4))是函数type的一部分

也就是说,ref限定符肯定是该类型的一部分。进一步根据8.4.1 [dcl.fct.def.general]第5段,您可以创建指向成员的指针,包括ref限定符:

cv-qualifier-seq或ref限定符(或两者)可以是非静态成员函数声明,非静态成员函数定义或仅指向成员函数的指针的一部分(8.3.5);见9.3.2。

对于使用ref-qualifier的成员函数的指针不能用作非类型模板参数,没有特别的限制。也就是说,我认为您尝试使用的部分专业化应该起作用。但是,在lang和gcc中,对ref限定符的支持是一个相当新的功能,即,可能不是所有的极端情况都已解决。我在上面用gcc(20130811)和clang(trunk 190769)的最新快照尝试了上述片段,并且都编译了代码。当然,此代码片段实际上并没有做任何事情,我也没有尝试滥用此功能。我猜您刚刚触发了一些编译器错误,并且我相信这两个项目都将赞赏根据其最新快照提供的错误报告。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

成员函数作为功能模板的参数

来自分类Dev

如何编写以可变参数作为模板参数的成员函数

来自分类Dev

将成员函数作为参数传递给函数模板

来自分类Dev

将静态成员函数作为模板参数传递

来自分类Dev

成员函数指针的decltype作为c ++ 11中的模板参数

来自分类Dev

Lambda作为成员函数模板的默认参数

来自分类Dev

模板类型的成员枚举类作为函数参数

来自分类Dev

将成员函数指针作为参数传递给模板方法

来自分类Dev

将静态成员函数作为模板参数传递

来自分类Dev

成员函数指针的decltype作为c ++ 11中的模板参数

来自分类Dev

可变参数函数模板接受任何指针(指向变量,函数,成员函数等)作为参数

来自分类Dev

为将成员函数指针作为模板参数的成员函数定义代理

来自分类Dev

将模板类作为类成员函数内的模板模板参数传递

来自分类Dev

在RValue对象上调用LValue ref合格成员函数

来自分类Dev

模板类成员函数的参数

来自分类Dev

C++静态模板类成员作为朋友模板函数默认参数

来自分类Dev

传递模板的模板成员类型作为模板模板参数

来自分类Dev

传递模板的模板成员类型作为模板模板参数

来自分类Dev

如何传递具有可变参数作为模板参数的成员函数?

来自分类Dev

将模板类/结构的成员函数地址作为函数参数传递

来自分类Dev

如何将非静态成员函数作为模板参数传递给另一个成员函数?

来自分类Dev

任何函数作为模板参数

来自分类Dev

任何函数作为模板参数

来自分类Dev

可变模板,函数作为参数

来自分类Dev

如何使用函数指针作为参数初始化模板的静态成员

来自分类Dev

调用作为模板参数从 lambda 传递的成员函数指针崩溃

来自分类Dev

模板函数指针作为模板参数

来自分类Dev

传递ref作为函数参数React Native

来自分类Dev

constexpr函数参数作为模板参数

Related 相关文章

  1. 1

    成员函数作为功能模板的参数

  2. 2

    如何编写以可变参数作为模板参数的成员函数

  3. 3

    将成员函数作为参数传递给函数模板

  4. 4

    将静态成员函数作为模板参数传递

  5. 5

    成员函数指针的decltype作为c ++ 11中的模板参数

  6. 6

    Lambda作为成员函数模板的默认参数

  7. 7

    模板类型的成员枚举类作为函数参数

  8. 8

    将成员函数指针作为参数传递给模板方法

  9. 9

    将静态成员函数作为模板参数传递

  10. 10

    成员函数指针的decltype作为c ++ 11中的模板参数

  11. 11

    可变参数函数模板接受任何指针(指向变量,函数,成员函数等)作为参数

  12. 12

    为将成员函数指针作为模板参数的成员函数定义代理

  13. 13

    将模板类作为类成员函数内的模板模板参数传递

  14. 14

    在RValue对象上调用LValue ref合格成员函数

  15. 15

    模板类成员函数的参数

  16. 16

    C++静态模板类成员作为朋友模板函数默认参数

  17. 17

    传递模板的模板成员类型作为模板模板参数

  18. 18

    传递模板的模板成员类型作为模板模板参数

  19. 19

    如何传递具有可变参数作为模板参数的成员函数?

  20. 20

    将模板类/结构的成员函数地址作为函数参数传递

  21. 21

    如何将非静态成员函数作为模板参数传递给另一个成员函数?

  22. 22

    任何函数作为模板参数

  23. 23

    任何函数作为模板参数

  24. 24

    可变模板,函数作为参数

  25. 25

    如何使用函数指针作为参数初始化模板的静态成员

  26. 26

    调用作为模板参数从 lambda 传递的成员函数指针崩溃

  27. 27

    模板函数指针作为模板参数

  28. 28

    传递ref作为函数参数React Native

  29. 29

    constexpr函数参数作为模板参数

热门标签

归档