【问题标题】:Assign a value to a std::reference_wrapper为 std::reference_wrapper 赋值
【发布时间】:2013-03-17 17:18:55
【问题描述】:

我们如何为 std::reference_wrapper 包裹的项目赋值?

int a[] = {0, 1, 2, 3, 4};

std::vector <std::reference_wrapper<int>> v(a, a+5);

v[0] = 1234;  // Error, can not assign value !

根据错误,直接赋值被删除:

错误:使用已删除的功能 'std::reference_wrapper<_tp>::reference_wrapper(_Tp&&) [with _Tp = 整数]'

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    使用get()成员函数:

    v[0].get() = 1111; // ok
    

    Herestd::reference_wrapper 的所有成员函数的列表。因为operator=

    reference_wrapper& operator=( const reference_wrapper<T>& other );
    

    int 字面量被转换为引用包装器,它失败了,并且是您看到的错误消息。

    或者,您可以显式调用转换运算符 (static_cast&lt;int&amp;&gt;(v[0]) = 1111;),但最好使用上面显示的 get() 方法。

    【讨论】:

    • 只是想知道,转换运算符不能这样用有什么用?当get() 在那里时,我发现static_cast&lt;int &amp;&gt;(v[0]) = 1111; 有点愚蠢。
    • 也许补充一点 std::reference_wrapper 的非显式构造函数在这里很重要,例如boost::reference_wrapper 没有。
    • @chris,这样您就可以将reference_wrapper&lt;T&gt; 传递给采用T&amp; 的函数(我猜您也可以在那里调用get(),但它会更冗长)。
    • @chris,转换运算符是在通过一些转发函数将引用从包装器中取出后,它不能帮助您更新存储的值。它包含一个引用,而不是一个值。
    • @StephenLin,您可以在那里调用get(),但预期的用例是用于需要引用参数的函数,因此在初始化函数参数时会发生转换,在进入函数之前,所以函数通常看不到reference_wrapper,甚至不知道它在那里,调用者不知道它正在转发什么,所以不想为@添加特殊情况987654338@,它通常是一个模板参数,可以是任何东西,所以你希望它可以轻松工作
    猜你喜欢
    • 2020-06-18
    • 2020-02-09
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2015-07-27
    • 2021-03-20
    • 1970-01-01
    相关资源
    最近更新 更多