Почему неустойчиво не компилируется с std:: min
Почему следующий код не компилируется (gcc-5.4.0)?
volatile int i{100};
int j{200};
std::cout << std::min(i, j);
Я имею в виду, что я вижу ошибку компилятора:
error: нет соответствующей функции для вызова "min (volatile int &, int &)
Не является ли волатильным просто намек на компилятор, что переменная может меняться извне программы?
std::min(int(i), j);
Конечно, работает. Но не должна ли оригинальная работа тоже?
Ответы
Ответ 1
volatile
является классификатором, аналогичным const
. Это больше, чем просто намек на компилятор.
std::min
ожидает, что два параметра будут иметь одинаковые типы и квалификаторы. Поэтому в вашем случае он выдает диагностику.
Поскольку вам разрешено вводить квалификаторы, вы можете побаловать себя небольшим количеством рук и написать
std::min<volatile int>(i, j)
Ответ 2
Как указывал @Bathsheba, тип вывода по двум аргументам должен давать один и тот же тип.
Но ради полноты std::min
также перегружается, чтобы принять a std::initializer_list
. Элементы этого объекта подлежат инициализации копий, поэтому верхние уровни cv-квалификаторы несущественны. Итак, это сработает:
std::cout << std::min({i, j});
Просто имейте в виду, что он выполняет копии и не принимает или не возвращает ссылки.