Другая версия перегруженной функции (const int * const & / &&) вызывается при передаче const int * и int * - PullRequest
3 голосов
/ 11 июля 2019

Я столкнулся с ошибкой в ​​моем коде, когда вызывалась неправильная перегруженная функция.

Проблема сводится к следующему:

void func(const int* const& ptr){
    std::cout << "LValue reference\n";
}
void func(const int* const&& ptr){
    std::cout << "RValue reference\n";
}

int main(){
    const int* ptr;

    func(ptr);

    return 0;
}

Приведенный выше код работает, как и ожидалось,это печатает LValue reference.Однако когда я изменяю const int* ptr на int* ptr, программа печатает RValue reference.Это странно для меня, так как я передаю это подтвержденное LValue.Это приводит меня к мысли, что происходит некое неявное преобразование, которое превращает его в RValue.Я изучил его с помощью компилятора godbolt, который, на первый взгляд, подтвердил бы мои подозрения, но я ничего не знаю о сборке, поэтому не могу сказать наверняка.

Итак, вопрос в том, чтоздесь происходит?

1 Ответ

9 голосов
/ 11 июля 2019

int* отличается от типа const int*.Поскольку они не относятся к одному и тому же типу, необходимо выполнить преобразование, поскольку вы не можете связать ссылку с другим типом, тогда она объявляется ссылкой (кроме случаев, когда речь идет о производных объектах).

Это означает, чтоint* используется для создания временного const int*, и этот временный указатель является rvalue.Поскольку это значение rvalue, будет выбрана ссылочная перегрузка rvalue.

...