Я пишу сетевую библиотеку и сильно использую семантику перемещения, чтобы обрабатывать права собственности на дескрипторы файлов. Один из моих классов хочет получить файловые дескрипторы других видов и взять на себя ответственность, так что это что-то вроде
struct OwnershipReceiver
{
template <typename T>
void receive_ownership(T&& t)
{
// taking file descriptor of t, and clear t
}
};
Он должен обрабатывать несколько несвязанных типов, поэтому receive_ownership должен быть шаблоном, и, чтобы быть в безопасности, я хочу, чтобы он ТОЛЬКО связывался с rvalue ссылками, так что пользователь должен явно указывать std:: move при передаче lvalue.
receive_ownership(std::move(some_lvalue));
Но проблема в том, что вычет шаблона С++ позволяет передавать lvalue без лишних усилий. И я фактически застрелился на ноге, случайно передав lvalue для получения_владения и использую эту lvalue (очищенную) позже.
Итак, вот вопрос: как сделать шаблон ТОЛЬКО привязанным к ссылке rvalue?