Рассмотрим следующий пример кода:
#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 бита. Где тогда двусмысленность?
Попытка сделать то же самое с «unsigned long x» вместо «size_t x» приводит к аналогичному сообщению об ошибке неоднозначности.
В системах Linux/Solaris при тестировании с разными версиями GCC, разными архитектурами и т. д. двусмысленности не сообщается (и для каждой архитектуры используется правильная перегрузка).
Это ошибка Mac OS X или функция?
size_t
может быть подписанным типом - person BЈовић   schedule 23.07.2012size_t
не было подписано. В §18.2/6 говорится: Тип size_t — это определяемый реализацией целочисленный тип без знака, который достаточно велик, чтобы содержать размер в байтах любого объекта. - person Philipp   schedule 23.07.2012size_t r; /* ... */ boost::endian::big_to_native_inplace(r);
. В Linux/Solaris это работает, в Mac OSX это прерывается из-за ошибки компиляции неоднозначности, потому что boost::endian предоставляет перегрузки только для целочисленных типов с фиксированной шириной. См. также: github.com/boostorg/endian/pull/14 - person maxschlepzig   schedule 27.05.2017