Почему возникает неоднозначность между uint32 _t и uint64 _t при использовании размера _t в Mac OS X?

Рассмотрим следующий пример кода:

#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

Почему? Потому что «размер _t» должен быть беззнаковым и иметь ширину 32 или 64 бита. Где тогда двусмысленность?

Попытка сделать то же самое с «unsigned long x» вместо «size _t x» приводит к аналогичное сообщение об ошибке неоднозначности.

В системах Linux/Solaris при тестировании с разными версиями GCC, разными архитектурами и т. д. не было сообщений о двусмысленности (и для каждой архитектуры используется правильная перегрузка ).

Это ошибка Mac OS X или функция?

15
задан maxschlepzig 22 July 2012 в 20:38
поделиться