Почему неустойчиво не компилируется с 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});

Просто имейте в виду, что он выполняет копии и не принимает или не возвращает ссылки.