次のコード例を検討してください。
#include <iostream>
#include <inttypes.h>
using namespace std;
int f(uint32_t i)
{
return 1;
}
int f(uint64_t i)
{
return 2;
}
int main ()
{
cout << sizeof(long unsigned) << '\n';
cout << sizeof(size_t) << '\n';
cout << sizeof(uint32_t) << '\n';
cout << sizeof(uint64_t) << '\n';
//long unsigned x = 3;
size_t x = 3;
cout << f(x) << '\n';
return 0;
}
これは Mac OSX では次のように失敗します。
$ g++ --version
i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)
$ make test
g++ test.cc -o test
test.cc: In function 'int main()':
test.cc:23: error: call of overloaded 'f(size_t&)' is ambiguous
test.cc:6: note: candidates are: int f(uint32_t)
test.cc:10: note: int f(uint64_t)
make: *** [test] Error 1
なんで?「size_t」は符号なしで、32 ビットまたは 64 ビット幅でなければならないためです。では曖昧さはどこにあるのでしょうか?
「size_t x」の代わりに「unsigned long x」を使用して同じことを試みると、同様のあいまいなエラー メッセージが表示されます。
Linux/Solaris システムでは、さまざまな GCC バージョン、さまざまなアーキテクチャなどでテストを行っています。あいまいさは報告されていません (そして、各アーキテクチャで適切なオーバーロードが使用されています)。
これは Mac OS X のバグですか、それとも機能ですか?