【问题标题】:reference_wrapper<string> does not print in cout, but reference_wrapper<int> does?reference_wrapper<string> 不在 cout 中打印,但 reference_wrapper<int> 呢?
【发布时间】:2020-03-03 05:41:38
【问题描述】:

为什么我试图打印“reference_wrapper for string”的行对不受支持的操作员给出错误

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

【问题讨论】:

    标签: c++ templates reference-wrapper


    【解决方案1】:

    operator&lt;&lt; for std::string是一个函数模板,当被传递一个reference_wrapper时,最后一个模板参数Allocator推导失败;因为在template argument deduction 中不会考虑隐式转换。

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

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

    另一方面,operator&lt;&lt; for int 是非模板,则不存在此类问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-22
      • 2023-03-17
      • 2020-02-09
      • 1970-01-01
      • 2015-07-27
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多