「オブジェクト型」または「参照型」であるとT&&
推測できるユニバーサル参照T
あなたの例では、右辺値が渡されたときのT
ように推測できるため、関数パラメーターはです。または、左辺値が渡されたときのように推測できます。int
int&&
T
int&
int&
std::add_rvalue_reference<int&>::type
int&
T
(あなたの例のように)関数呼び出しによって推定されない場合X::baz
、それは推定できないint&
ため、参照はユニバーサル参照ではありません。
したがって、私見では、新しい構文は本当に必要ありません。テンプレート引数の推定と参照の折りたたみルールにうまく適合し、テンプレートパラメーターを参照型として推定できるという小さな調整があります (C++03 では、型の関数テンプレートパラメーターT
または、常にオブジェクト型としてT&
推測します。)T
これらのセマンティクスとこの構文は、転送の問題の解決策として右辺値参照と引数演繹規則の微調整が提案された当初から提案されていました。 N1385を参照してください。この構文を使用して完全な転送を提供することは、移動セマンティクスの目的で右辺値参照を提案することと並行して提案されました。N1377は N1385 と同じメールに含まれていました。代替構文が真剣に提案されたことはないと思います。
とにかく、代替構文は実際にはもっと混乱するでしょう。ユニバーサル参照の構文があっtemplate<typename T> void bar(T&@)
たが、現在と同じセマンティクスを使用している場合bar(i)
、テンプレート パラメーターを呼び出すときにorT
として推定でき、関数パラメーターはor ... 型であり、どちらも " " ではありません (その型が何であれ.) したがって、宣言子は実際には常に他の型 (または.int&
int
int&
int&&
T&@
T&@
int&
int&&
少なくとも、私たちが得た構文では型T&&
は実数型であり、参照の折りたたみ規則はユニバーサル参照を使用する関数テンプレートに固有のものではなく、テンプレートの外側の型システムの残りの部分と完全に一致しています:
struct A {} a;
typedef A& T;
T&& ref = a; // T&& == A&
または同等:
struct A {} a;
typedef A& T;
std::add_rvalue_reference<T>::type ref = a; // type == A&
T
左辺値参照型の場合もT&&
同様です。新しい構文は必要ないと思います。ルールはそれほど複雑でもなく、ややこしいものでもありません。