rvalue reference в параметре
void h(const int& n) {//тут эрвелью
cout << "copy\n";
}
void h(int&& n) {//тут эрвелью и какую выбрать?
cout << "move\n";
}
int main() {
int y = 0;
h(y);
h(9);}
Вопрос: если константная rvalue ссылка может принимать как rvalue, так и lvalue, по какому принципу тогда выбирается функция для rvalue? Есть что ли какой-то приоритет выбора? И почему еще после std::move() обязательно идет в rvalue-ref если она и в const lvalue reference также может?
Ответы (1 шт):
Для обычных объектов вы можете сделать четыре декларации функций. И на каждый тип будет отдельная функция. Если какого-то вида не написали, будет выполнен другой, в зависимости от приоритетов.
Вот граф. Начинать искать надо от входного типа, и спускаться ниже для поиска функции с максимальным приоритетом.
&
/ \
C & \
\ \
\ V &
\ /
C V &
C - const
V - volatile
Пример :
int fun ( int & ) ;
int fun ( int const & ) ;
int main(){
int x ;
fun ( x ) ;
}
Будет вызван int fun ( int & ) ; так как у него выше приоритет чем у int fun ( int const & ) ;.
Если добавить декларацию функции, принимающую по значению, то она будет конфликтовать неоднозначностью с T &&, T const && и T const &. Лучше выбирать тип ссылки.
r-value объект также может быть принят l-value константной ссылкой. И граф выбора функций будет такой :
&&
/ \
C && \
/ \ \
/ \ V &&
/ \ /
/ C V &&
/
C &
C - const
V - volatile