【发布时间】:2013-09-11 16:11:38
【问题描述】:
这在 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),并且是 supported by gcc 4.8.1。
这里的问题是将它们用作模板参数,其中 gcc 似乎无法区分 ref 限定和普通成员函数类型。
clang对std库的实现好像检测了这个特性是否被支持
__has_feature(cxx_reference_qualified_functions)
那么,这种使用 ref 限定函数是标准还是语言扩展?
【问题讨论】:
标签: c++ templates c++11 member-functions ref-qualifier