ref-квалифицированные функции-члены как аргументы шаблона?

Это хорошо компилируется в 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-квалифицированные функции-члены называются "ссылками rvalue для * this" (N2439) в стандарте, и являютсяподдерживается gcc 4.8.1.

Проблема здесь состоит в том, чтобы использовать их в качестве аргументов шаблона, где gcc, по-видимому, не делает различий между квалифицированным и обычным типом функции-члена.

Реализация библиотеки std в clang обнаруживает, поддерживается ли эта функция

__has_feature(cxx_reference_qualified_functions)

Итак, является ли это использование стандартных функций ref или расширением языка?

Ответы на вопрос(1)

Ваш ответ на вопрос