Я думал, что это будет легко решить вопрос через Google, но я не могу найти окончательный (или даже предположительный) ответ:
При использовании оператора сравнения, в каком порядке происходит неявное приведение типов?
int i = -1;
size_t t = 1;
bool result = i < t;
Является ли это эквивалентом:
bool result = i < int(t); // equals true
or:
bool result = size_t(i) < t; // equals false
Это легкая часть вопроса - вторая часть - "каково общее правило", каким оно может быть:
- Аргумент «более простой» всегда преобразуется в аргумент «более сложный» (т.е. size_t->int) или
- Первый (или второй) аргумент всегда преобразуется в тип второго (или первого) аргумента или
- Встроенные примитивы, такие как size_t и ints, имеют специальные операторы сравнения, которые определяют приведение в каждом конкретном случае.
Все три варианта кажутся разумными, хотя второй приводил бы к значительному поведению, отличающемуся от интуитивно ожидаемого большинством людей.
Компилятор VC++, похоже, считает, что при сравнении int с size_t следует выдавать предупреждение уровня 3, и все же он выдает предупреждение уровня 4 только тогда, когда вы возвращаете отрицательное число из функции, которая возвращает size_t (что приводит к числу, просто более половины максимального возвращаемого целого числа).
Пытаясь избавиться от всех предупреждений 4-го уровня, я теперь все равно явно привожу все, но я хотел знать «правду». Это должно быть определено где-то...