reference_wrapper <string>не печатает в cout, но reference_wrapper <int>делает? - PullRequest
3 голосов
/ 03 марта 2020

Почему строка, где я пытаюсь напечатать "reference_wrapper for string", выдает ошибку для неподдерживаемого оператора << для "reference_wrapper for string", но не дает "reference_wrapper for int"? </p>

int main(){

    int  s= 43;
    string str = "hello";

    reference_wrapper<int> x{s};
    reference_wrapper<string> y{str};

    x.get() = 47;
    y.get() = "there";

    cout<<"printing original int "<<s<<"\n";
    cout<<"printing original string "<<str<<"\n";

    cout<<"printing reference_wrapper for int "<<x<<"\n";
    cout<<"printing reference_wrapper for string "<<y<<"\n"; // gives error

    int& refint = x;
    string& refstr = y;

    cout<<"printing reference for int "<<refint<<"\n";
    cout<<"printing reference for string "<<refstr<<"\n";
}

1 Ответ

2 голосов
/ 03 марта 2020

operator<< для std::string - шаблон функции, при передаче reference_wrapper последний аргумент шаблона Allocator не может быть выведен; потому что неявное преобразование не будет учитываться при выводе аргумента шаблона .

Вывод типа не учитывает неявные преобразования (кроме корректировок типа, перечисленных выше): это работа для разрешение перегрузки , которое происходит позже.

В качестве обходного пути вы можете явно вызвать std::reference_wrapper<T>::get или выполнить явное преобразование.

На с другой стороны, operator<< для int не является шаблоном, поэтому такой проблемы не возникает.

...