Есть у меня несколько классов, сутью которых являются 64-разрядные целые значения — например, 64-разрядный атомарный счетчик, который может быть интерпретирован как знаковый или беззнаковый, а также как 32-разрядный (по младшей части). Но MSVC 15.00 (из VS 2008) категорически отказывается сам выполнять вполне очевидные преобразования.
Если для user-defined conversion я определяю только операторы преобразования к [unsigned] __int64, то компилятор жалуется на неоднозначность автоматического преобразования при сравнении с нулем или положительной литеральной константой. Если добавляю определение операторов сравнения — начинает жаловаться на неоднозначность выбора такого оператора. В этом вообще есть хоть какой-то смысл? То есть, есть живые архитектуры, на которых знаковый и беззнаковый нуль имеет различное двоичное представление?
Если же добавляю, например, операторы += для [unsigned] __int64, то начинаются жалобы на неоднозначность даже при тупом присваивании объекту значения переменной типа unsigned int. Уж если правый операнд четко имеет тип unsigned int, то логично преобразовывать его в unsigned __int64, а не просто в __int64?
Можно ли как-то заставить компилятор проявлять чуть больше интеллекта, кроме как специализировать классы конкретными типами через шаблоны?