Не задумываясь о том, что можно сделать для решения проблемы std::min
dangling reference problem, я подумал, что я должен был добавить перегрузку (фактически 3 - для каждой комбинации) для rvalues, которые будут удалены. Проблема в том, что T&&
будет ссылкой на пересылку, а не ссылкой на rvalue.Контроль над тем, какие ссылки `T` связывает
Я хочу отдельно отделить этот вопрос от std::min
и сделать его более общим. В качестве примера можно привести std::min
, почему вам нужна такая вещь.
Позволяет упростить и обобщить задачу:
// this has the same problem as `std::min`: if t binds to a temporary,
// and the result is assigned to `auto&`, the result is a dangled reference
template <class T>
const T& foo(const T& t)
{
return t;
}
// incorrect attempt to prevent foo from being called with a temporary argument
// `T&&` is a forwarding reference, not an rvalue reference
template <class T>
const T& foo(T&& t) = delete;
Вопрос: Как вы можете контролировать, какие виды ссылок общий параметр шаблона T
может связывать? И как он может масштабироваться для нескольких аргументов (например, в случае std::min
)?
Очень хороший пример с 'std :: ref' – bolov
Вы видите более простой способ сделать эту работу для нескольких параметров, кроме объявления каждой возможной комбинации http://ideone.com/AJgqV8? – bolov
@bolov Нет, я не вижу другого пути. Похоже, это либо ужасное выражение 'enable_if', либо несколько удаленных перегрузок. Ни один из них не является особенно привлекательным. – Praetorian