这在 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 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm)在标准中,并且是由 gcc 4.8.1 支持 http://gcc.gnu.org/projects/cxx0x.html.
这里的问题是使用它们作为模板参数,其中 gcc 似乎不区分 ref 限定类型和普通成员函数类型。
clang 对 std 库的实现似乎可以检测该功能是否受支持
__has_feature(cxx_reference_qualified_functions)
那么,这种使用 ref 限定函数是标准的,还是语言扩展?