【问题标题】:How do reference_wrapper and std::ref work?reference_wrapper 和 std::ref 是如何工作的?
【发布时间】:2013-05-14 11:48:34
【问题描述】:

我正在尝试了解 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&lt;int&gt;。 在阅读the reference时, 我注意到std::reference_wrapper&lt;int&gt; 中没有+= 运算符。 那么,c += 1; 是如何有效的呢?

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    c += 1; 的有效性如何?

    因为reference_wrapper&lt;int&gt; 可以通过其转换运算符隐式转换为int&amp;;如果操作数类型本身没有合适的重载,则考虑对操作数进行隐式转换。

    【讨论】:

    • @Sungmin:确实,c 本身不能改变类型;但是+= 应用于c.operator int&amp;() 的结果,这将是对reference_wrapper 目标的引用。
    • 注意这个魔法只对操作员有效。例如,如果x 是类类型并且有一个方法x.foo(),并且您尝试将对x 的引用包装在reference_wrapper rx 中,那么您不能只说rx.foo()。你必须说rx.get().foo(),这和使用指针px-&gt;foo 一样丑陋。所以不幸的是,std::reference_wrapper 并不是一个神奇的万能引用包装器(这是很多人希望使用它的目的,例如for copying objects with reference members)。
    【解决方案2】:

    std::reference_wrapper&lt;T&gt; 有一个 conversion operatorT&amp;。这意味着 std::reference_wrapper 在您的示例中可以隐式转换为int&amp;

    【讨论】:

    • 两个答案几乎同时上传。但是 Mike Seymour 的回答要快一些。除此之外,我无法确定选择哪一个。对此感到抱歉。还是谢谢。
    • @Sungmin 欢迎您。无论如何,我认为 Seymour 的答案更好:他解释了运算符重载和操作数,而我没有这样做。
    猜你喜欢
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2020-11-15
    • 1970-01-01
    • 2013-08-10
    • 2020-02-09
    相关资源
    最近更新 更多