これは、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 修飾された関数のこの使用は標準ですか、それとも言語拡張ですか?