funções de membro ref-qualificadas como argumentos de modelo?
Isso compila bem no 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...) &> { };
mas falha no 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...)> { };
^
Quando usado em diferentes contextos, isso resulta em todos os tipos de comportamento inesperado do compilador, como erros de colisão ou de compilador interno.
Eu entendo que funções membro ref-qualificadas são referidas como "referências de valor para * isto" (N2439) no padrão, e sãosuportado pelo gcc 4.8.1.
O problema aqui é usá-los como argumentos de modelo, onde o gcc não parece discriminar entre um tipo de função de membro qualificado e ref-qualificado.
implementação do clang da biblioteca std parece detectar se este recurso é suportado por
__has_feature(cxx_reference_qualified_functions)
Então, esse uso de funções qualificadas ref é padrão ou uma extensão de linguagem?