私はこれがすでにここにあったに違いないと確信していますが、この種の問題を解決する方法についての情報はあまり見つかりませんでした(電話をかけずに):
2つのオーバーロードが与えられた場合、リテラル0の関数を使用した呼び出しは、常にunsignedintバージョンを呼び出す必要があります。
void func( unsigned int ) {
cout << "unsigned int" << endl;
}
void func( void * ) {
cout << "void *" << endl;
}
func( 0 ); // error: ambiguous call
これが発生する理由は理解できますが、func(0u)やfunc(static_cast(0))を常に記述したくはありません。だから私の質問は:
1)これを一般的に行うための推奨される方法はありますか?
2)次のように行うことに問題はありますか?これが機能する理由は何ですか?
void func( unsigned int ) {
cout << "unsigned int" << endl;
}
template <typename T>
void func( T * ) {
static_assert( std::is_same<T, void>::value, "only void pointers allowed" );
cout << "void *" << endl;
}
func( 0 ); // calls func( unsigned int )!