rvalue reference в параметре

Рейтинг: 0Ответов: 1Опубликовано: 11.04.2023
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 также может?

Ответы

▲ 3

Для обычных объектов вы можете сделать четыре декларации функций. И на каждый тип будет отдельная функция. Если какого-то вида не написали, будет выполнен другой, в зависимости от приоритетов.

Вот граф. Начинать искать надо от входного типа, и спускаться ниже для поиска функции с максимальным приоритетом.

     &
   /   \
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