引用限定的成员函数作为模板参数
ref-qualified member functions as template arguments?
这在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)
那么,这种使用引用限定的函数是标准的,还是语言扩展?
根据 8.3.5 [dcl.fct] 第 6 段(我在引用的文本中添加了一些突出显示):
返回类型、参数类型列表、ref 限定符和 cv-限定符-seq(但不是默认参数 (8.3.6) 或异常规范 (15.4))是函数类型的一部分。
也就是说,引用限定符肯定是该类型的一部分。此外,根据 8.4.1 [dcl.fct.def.general] 第 5 段,您可以创建指向成员的指针,包括 ref 限定符:
cv-qualifier-seq 或 ref-qualifier(或两者)可以是非静态成员函数声明、非静态成员函数定义或仅指向成员函数的指针 (8.3.5) 的一部分;请参阅 9.3.2。
没有特定的限制,指向带有 ref-qualifier 的成员函数的指针不能用作非类型模板参数。也就是说,我认为您尝试使用的部分专业化应该有效。然而,对 ref-qualifier 的支持在 clang 和 gcc 中都是一个相当新的功能,即可能并非所有极端情况都已得到解决。我尝试了上面的截图,其中包含 gcc (20130811) 和 clang(主干190769)的最新快照,并且都编译了代码。当然,这个片段并没有真正做任何事情,我没有试图滥用这个功能。我猜你只是触发了一些编译器错误,我相信这两个项目都会喜欢针对其最新快照的错误报告。
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类