3

为什么我试图打印“reference_wrapper for string”的行对不支持的 operator<< “reference_wrapper for string”给出错误,但没有给出“reference_wrapper for int”?

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";
}
4

1 回答 1

2

operator<<forstd::string是函数模板,传递 a 时reference_wrapper,最后一个模板参数Allocator推导失败;因为模板参数推导中不会考虑隐式转换。

类型推导不考虑隐式转换(除了上面列出的类型调整):这是重载决议的工作,稍后会发生。

作为解决方法,您可以std::reference_wrapper<T>::get显式调用或执行显式转换。

另一方面,operator<<forint是非模板,则不存在此类问题。

于 2020-03-03T05:51:34.550 回答