次の 2 つのオーバーロードを検討してください。
template <typename T> void foo(T &) {}
template <typename T> void foo(T &&) {}
それらは潜在的にあいまいですか?
次のコードは Clang 3.4 でコンパイルされますが、GCC 4.8 では失敗します。これは、オーバーロード (最初のものはT = int
、次のものはT = int&
) があいまいであることを示しています。
int main()
{
int n = 10;
foo(n);
}
「参照へのバインディング」はオーバーロード解決の点で「完全一致」であることを認識しているため、問題は、推論の1つが他のものよりも好ましいかどうか、またはそれらが同等に優れているかどうかに帰着すると思いT = int
ますT = int&
。