C++ перегрузка ссылки rvalue, отличная от конструктора перемещения

Может ли кто-нибудь привести пример функции, перегруженной параметром ссылки rValue, отличным от конструктора перемещения или оператора присваивания перемещения, который в полной мере использует тот факт, что переданный аргумент является значением r? Таким образом, он выполняет функциональность версии функции с lvalue-параметром, но также делает что-то особенное в дополнение (исключительно потому, что передается rvalue), кроме того, что делает копирование или присваивание более эффективным. Возможно, сделать какое-то другое действие более эффективным? Еще лучше, возможно, что-то дополнительное, что необходимо в некоторых ситуациях, но не может быть выполнено с помощью lvalue? Пока не могу вспомнить ни одного примера.

Итак, я спрашиваю о перегрузке вашей собственной функции:

void ping (const Person& person) {
    // do something 
}

void ping (Person&& person) {
    // do what the first ping does but take advantage of the fact that an rvalue (a temporary?) was passed 
}

person prestokeys    schedule 19.12.2013    source источник


Ответы (1)


Многие другие операторы имеют перегрузки rvalue-reference в стандартной библиотеке, например, operator+ для строк:

template<class charT, class traits, class Allocator>
basic_string<charT,traits,Allocator>
operator+(const charT* lhs,
basic_string<charT,traits,Allocator>&& rhs);

template<class charT, class traits, class Allocator>
basic_string<charT,traits,Allocator>
operator+(basic_string<charT,traits,Allocator>&& lhs,
const charT* rhs);

и т.д

И, конечно же, push_back и emplace_back, а также остальные семейства функций вставки/размещения в контейнерах:

void push_back(T&& x);
template <class... Args> void emplace_back(Args&&... args);
person Cubbi    schedule 19.12.2013
comment
и все, что делает идеальную переадресацию в основном - person Tim Seguine; 20.12.2013