Насколько оправданы жалобы компилятора на ambiguous conversion
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.10.17 10:09
Оценка:
Есть у меня несколько классов, сутью которых являются 64-разрядные целые значения — например, 64-разрядный атомарный счетчик, который может быть интерпретирован как знаковый или беззнаковый, а также как 32-разрядный (по младшей части). Но MSVC 15.00 (из VS 2008) категорически отказывается сам выполнять вполне очевидные преобразования.

Если для user-defined conversion я определяю только операторы преобразования к [unsigned] __int64, то компилятор жалуется на неоднозначность автоматического преобразования при сравнении с нулем или положительной литеральной константой. Если добавляю определение операторов сравнения — начинает жаловаться на неоднозначность выбора такого оператора. В этом вообще есть хоть какой-то смысл? То есть, есть живые архитектуры, на которых знаковый и беззнаковый нуль имеет различное двоичное представление?

Если же добавляю, например, операторы += для [unsigned] __int64, то начинаются жалобы на неоднозначность даже при тупом присваивании объекту значения переменной типа unsigned int. Уж если правый операнд четко имеет тип unsigned int, то логично преобразовывать его в unsigned __int64, а не просто в __int64?

Можно ли как-то заставить компилятор проявлять чуть больше интеллекта, кроме как специализировать классы конкретными типами через шаблоны?
user-defined conversion преобразование тип класс неоднозначность
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.