Поскольку для ссылка для пересылки , T
никогда не будет выводиться как ссылка на значение.Предположим, что передача объекта типа int
в OwnershipReceiver
, если объект является lvalue, T
будет выведена как lvalue-reference, то есть int&
;если объект является значением r, T
будет выведено как нереференсное, то есть int
.Вот почему std::is_rvalue_reference<T>::value
не будет работать, потому что это всегда false
.
Обратите внимание, что цель кода - убедиться, что тип параметра OwnershipReceiver
является ссылкой-значением, это не такозначают, что тип T
также является rvalue-ссылкой.
Другими словами, смысл здесь различать lvalue-reference и non-reference, поэтому !std::is_reference<T>::value
тоже работает.
Кстати: если вы придерживаетесь std::is_rvalue_reference
,вы можете использовать std::is_rvalue_reference<T&&>::value
, как вы нашли в комментарии , или использовать его для параметра t
, например,
template <typename T>
auto receive_ownership(T&& t) -> typename std::enable_if<std::is_rvalue_reference<decltype(t)>::value>::type
{
// taking file descriptor of t, and clear t
}