这在 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 限定函数的标准,还是语言扩展?