Тип 0
, который является int
, не соответствует типу аргументов вашего оператора []
, поэтому необходимо преобразование.
Однако он соответствует встроенному оператору []
для типа указателя Element
. В этом случае Clang выдает более описательное сообщение об ошибке: https://godbolt.org/z/FB3DzG (обратите внимание, что я изменил параметр на int64_t
, чтобы это не удалось на x64).
Компилятор должен сделать одно преобразование, чтобы использовать оператор класса (индекс от int
до size_t
), и одно преобразование, чтобы использовать встроенный оператор (от Array
до Element*
), это неоднозначно, что один он должен использовать.
Он работает на x64, поскольку вашему оператору класса все еще требуется только одно преобразование для индекса, но встроенному оператору требуется 2, 1 для Array
до Element*
и один для индекса от int
до int64_t
это делает ваш оператор класса более подходящим и поэтому не является двусмысленным.
Решение состоит в том, чтобы либо сделать оператор преобразования явным (что в любом случае является хорошей идеей), либо гарантировать, что тип, который вы передаете в качестве индекса, соответствует типу, ожидаемому вашим оператором. В вашем примере вы можете просто передать 0U
вместо 0
.