C++11 の完全な転送機能を試しています。Gnu g++ コンパイラは、関数とパラメーターのバインドのあいまいさの問題を報告します (エラーは、以下のソース コードの後に表示されます)。私の質問は、なぜそうなのかということです。関数とパラメーターのバインディングプロセスに従っていると、あいまいさがわかりません。私の推論は次のとおりです。 aは左辺値であるため、 main() でtf(a)を呼び出すとtf(int&) にバインドされます。次に、関数tfは左辺値参照int& aを関数gに転送するため、関数void g(int &a)を一意に呼び出す必要があります。したがって、あいまいさの理由がわかりません。オーバーロードされた関数g(int a)コードから削除されます。g(int a)はint &aとのバインドの候補にならないため、これは奇妙です。
これが私のコードです:
void g(int &&a)
{
a+=30;
}
void g(int &a)
{
a+=10;
}
void g(int a) //existence of this function originates the ambiguity issue
{
a+=20;
}
template<typename T>
void tf(T&& a)
{
g(forward<T>(a));;
}
int main()
{
int a=5;
tf(a);
cout<<a<<endl;
}
コンパイルg++ -std=c++11 perfectForwarding.cppは、次のエラーを報告します。
perfectForwarding.cpp: In instantiation of ‘void tf(T&&) [with T = int&]’:
perfectForwarding.cpp:35:7: required from here
perfectForwarding.cpp:24:3: error: call of overloaded ‘g(int&)’ is ambiguous
perfectForwarding.cpp:24:3: note: candidates are:
perfectForwarding.cpp:6:6: note: void g(int&&) <near match>
perfectForwarding.cpp:6:6: note: no known conversion for argument 1 from ‘int’ to ‘int&&’
perfectForwarding.cpp:11:6: note: void g(int&)
perfectForwarding.cpp:16:6: note: void g(int)