Подтвердить что ты не робот

Как работают reference_wrapper и std:: ref?

Я пытаюсь понять, как работает std:: ref.

#include <functional>
#include <iostream>

template <class C>
void func(C c){
    c += 1;
}

int main(){
    int x{3};
    std::cout << x << std::endl;
    func(x);
    std::cout << x << std::endl;
    func(std::ref(x));
    std::cout << x << std::endl;
}

Output : 3 3 4

В приведенном выше коде, я думаю, что параметр шаблона C для третьего вызова функции создается как std::reference_wrapper<int>. Читая ссылку, Я заметил, что в std::reference_wrapper<int> нет оператора +=. Затем, как c += 1; допустимо?

4b9b3361

Ответ 1

Как действует c += 1;?

Потому что reference_wrapper<int> неявно конвертируется в int& через свой оператор преобразования; и неявные преобразования рассматриваются для операндов, если нет подходящей перегрузки для самого типа операнда.

Ответ 2

std::reference_wrapper<T> имеет оператор преобразования до T&. Это означает, что std:: reference_wrapper может быть неявно преобразован в int& в вашем примере.