Разве int не является константным int?
Нет, это просто int
, а не const
, а - это , определенное как prvalue , следовательно, ссылка на значение не может привязаться к нему - как в вашем случае.
Легко исправляется, если исходный шаблон выглядит так:
template<typename T>
const T& min(const T& a, const T& b){
return a < b ? a : b;
}
как const T&
будет также привязываться к rvalue s.
Избегайте изменения или добавления чего-либо подобного этому:
template<typename T, typename U>
auto&& min(T&& a, U&& b){
return std::forward<T>(a < b ? a : b);
}
, поскольку здесь мы не создаем копию из материализованного временного объекта, и поэтому мы рискуем вернуть висящую ссылку . Смотрите здесь в [class.tevent] :
Временный объект, связанный со ссылочным параметром в вызове функции
([expr.call]) сохраняется до завершения полного выражения
содержащий вызов.
... в этот момент он умирает. Отсюда и свисание.