次のコードは、g ++ 4.1.2およびg ++ 4.4.4でコンパイルされました。どちらもコメントに記載されている結果を示します。非constポインタを持つ関数を呼び出すと、constへのポインタを取る関数上のテンプレート関数に戻ります
int f(const int * a)
{
return 0;
}
template<typename A>
int f(A a)
{
return 1;
}
int main()
{
int x;
// return f(&x); // returns 1
return f((const int *)&x); // returns 0
}
その代わり、期待f(const int *)
のf<int *>(int *)
に解決f(int *)
のコールに煮詰めるように見えます。私はこれが衝撃的で、まったく直感的ではないことを発見しました。
これはg ++のバグか、C++の暗いコーナーか、なんらかの理由で明白ですか?それがバグでなければ、その背後にある理論や論理はなんですか?この問題に関する安全対策はありますか?
ANSI C++コンパイラに関する限り、 'f(int)'と 'f(const int)'は同じプロトタイプです – sehe
'f(int *)'は 'f(const int * )/ f(int const *) ' – Roland
おそらく。 Link:http://stackoverflow.com/questions/2121525/const-pointers-in-overload-resolution/2121616#2121616 – sehe