这在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-qualified成员函数被称为“rvalue引用* this”(N2439),并且被gcc 4.8.1支持。
问题在于将它们用作模板参数时,gcc似乎无法区分ref-qualified和普通成员函数类型。
clang的std库实现似乎能够检测是否支持此功能。
__has_feature(cxx_reference_qualified_functions)
那么,ref-qualified函数的使用是标准的还是语言扩展?